首页 > 其他分享 >二叉树遍历

二叉树遍历

时间:2024-08-15 18:56:02浏览次数:13  
标签:遍历 TreeNode stack 二叉树 null root 节点

二叉树的遍历是二叉树操作中的一个基本且重要的概念,它指的是按照一定的规则访问二叉树中的每个节点,并且每个节点仅被访问一次。常见的二叉树遍历方式有四种:前序遍历(Pre-order Traversal)、中序遍历(In-order Traversal)、后序遍历(Post-order Traversal)和层序遍历(Level-order Traversal)。

1. 前序遍历(Pre-order Traversal)

前序遍历的顺序是:根节点 -> 左子树 -> 右子树。对于每个节点,都遵循这个顺序进行遍历。

  • 递归实现
    void preorderTraversal(TreeNode root) {  
        if (root == null) return;  
        System.out.print(root.val + " "); // 访问根节点  
        preorderTraversal(root.left); // 遍历左子树  
        preorderTraversal(root.right); // 遍历右子树  
    }
  • 非递归(迭代)实现(使用栈):
    void preorderTraversalIterative(TreeNode root) {  
        Stack<TreeNode> stack = new Stack<>();  
        if (root != null) stack.push(root);  
        while (!stack.isEmpty()) {  
            TreeNode node = stack.pop();  
            System.out.print(node.val + " "); // 访问节点  
            if (node.right != null) stack.push(node.right); // 先右后左保证左子树先遍历  
            if (node.left != null) stack.push(node.left);  
        }  
    }

    2. 中序遍历(In-order Traversal)

    中序遍历的顺序是:左子树 -> 根节点 -> 右子树。这常用于二叉搜索树(BST)中,因为这样可以得到一个有序的节点序列。

  • 递归实现
    void inorderTraversal(TreeNode root) {  
        if (root == null) return;  
        inorderTraversal(root.left); // 遍历左子树  
        System.out.print(root.val + " "); // 访问根节点  
        inorderTraversal(root.right); // 遍历右子树  
    }
  • 非递归(迭代)实现(使用栈):
    void inorderTraversalIterative(TreeNode root) {  
        Stack<TreeNode> stack = new Stack<>();  
        TreeNode curr = root;  
        while (curr != null || !stack.isEmpty()) {  
            while (curr != null) {  
                stack.push(curr);  
                curr = curr.left; // 遍历到最左节点  
            }  
            curr = stack.pop(); // 弹出栈顶元素  
            System.out.print(curr.val + " "); // 访问节点  
            curr = curr.right; // 转向右子树  
        }  
    }

    3. 后序遍历(Post-order Traversal)

    后序遍历的顺序是:左子树 -> 右子树 -> 根节点。

  • 递归实现
    void postorderTraversal(TreeNode root) {  
        if (root == null) return;  
        postorderTraversal(root.left); // 遍历左子树  
        postorderTraversal(root.right); // 遍历右子树  
        System.out.print(root.val + " "); // 访问根节点  
    }
  • 非递归(迭代)实现(使用栈):
    void postorderTraversalIterative(TreeNode root) {  
        Stack<TreeNode> stack = new Stack<>();  
        TreeNode prev = null; // 用于记录上一次访问的节点  
        while (root != null || !stack.isEmpty()) {  
            while (root != null) {  
                stack.push(root);  
                root = root.left; // 遍历到最左节点  
            }  
            root = stack.peek(); // 弹出栈顶元素但不移除  
            // 如果右子树为空或者右子树已经访问过,则访问当前节点  
            if (root.right == null || root.right == prev) {  
                stack.pop();  
                System.out.print(root.val + " "); // 访问节点  
                prev = root;  
                root = null; // 回到上层循环,检查是否有其他节点需要访问  
            } else {  
                root = root.right; // 否则,转向右子树  
            }  
        }  
    }

    4. 层序遍历

  • 非递归(迭代)实现(使用队列)

    import java.util.LinkedList;  
    import java.util.Queue;  
      
    class TreeNode {  
        int val;  
        TreeNode left;  
        TreeNode right;  
        TreeNode(int x) { val = x; }  
    }  
      
    public class BinaryTreeLevelOrderTraversal {  
        public void levelOrderTraversal(TreeNode root) {  
            if (root == null) return;  
      
            Queue<TreeNode> queue = new LinkedList<>();  
            queue.offer(root); // 将根节点加入队列  
      
            while (!queue.isEmpty()) {  
                TreeNode currentNode = queue.poll(); // 从队列中取出一个节点  
                System.out.print(currentNode.val + " "); // 访问该节点  
      
                // 如果左子节点不为空,则将其加入队列  
                if (currentNode.left != null) {  
                    queue.offer(currentNode.left);  
                }  
                // 如果右子节点不为空,则将其加入队列  
                if (currentNode.right != null) {  
                    queue.offer(currentNode.right);  
                }  
            }  
        }  
    }

  • 非递归(迭代)实现

  • 实际上,层序遍历不常使用递归实现,因为递归本质上是栈的操作,而层序遍历需要的是队列。但我们可以借助一些额外的数据结构(如数组或链表)来模拟层序遍历的效果,但这通常不是推荐的做法,因为它违背了层序遍历的本意。

标签:遍历,TreeNode,stack,二叉树,null,root,节点
From: https://blog.csdn.net/m0_74051652/article/details/141229510

相关文章

  • 【二叉树进阶】--- 二叉搜索树转双向链表 && 最近公共祖先
     Welcometo9ilk'sCodeWorld    (๑•́₃•̀๑) 个人主页:     9ilk(๑•́₃•̀๑) 文章专栏:   数据结构本篇博客我们继续了解一些二叉树的进阶算法。......
  • 一篇文章带你弄懂Python基础之列表介绍和循环遍历
    大家好,我是Go进阶者,今天给大家分享一些Python基础(列表基础和循环遍历介绍),一起来看看吧~一、列表介绍想一想:字符串可以用来存储一串信息,那么想一想,怎样存储所有同学的名字呢?定义100个变量,每个变量存放一个学生的姓名可行吗?有更好的办法吗?答:列表。1.列表的格式namesList=[......
  • 每日一题:Leetcode-662 二叉树最大宽度
    力扣题目解题思路java代码力扣题目:给你一棵二叉树的根节点 root ,返回树的 最大宽度 。树的 最大宽度 是所有层中最大的 宽度 。每一层的 宽度 被定义为该层最左和最右的非空节点(即,两个端点)之间的长度。将这个二叉树视作与满二叉树结构相同,两端点间会出现一些......
  • 实现二叉树的前序遍历
    序遍历的顺序是:先访问根节点,再访问左子树,最后访问右子树。递归和迭代classTreeNode{intval;TreeNodeleft;TreeNoderight;TreeNode(intval){this.val=val;this.left=null;this.right=null;}}publicclass......
  • 实现二叉树的中序遍历
    中序遍历的顺序是:先访问左子树,再访问根节点,最后访问右子树。 classTreeNode{intval;TreeNodeleft;TreeNoderight;TreeNode(intval){this.val=val;this.left=null;this.right=null;}}publicclassInorde......
  • 日撸Java三百行(day22:二叉树的存储)
    目录前言一、压缩存储二、层次遍历三、代码实现1.顺序表创建及初始化2.方法创建3.数据测试4.完整的程序代码总结前言关于二叉树的存储,昨天我们提到有顺序存储和链式存储这两种方式,不过非完全二叉树顺序存储的话会造成很大的空间浪费,所以我们昨天使用的是链式存储......
  • Map概述、构造方法、遍历
    packagecom.shujia.day15;importjava.util.HashMap;importjava.util.Map;/*Map:存储元素的特点是每一个元素是一个键值对{【name:"魏一民"】,【age:18】}Map集合的共同拥有的特点:1、Map集合中的元素,键是唯一的,不会在一个Map集合发现两个相同的键......
  • 代码随想录算法训练营第十四天(一)| 226.翻转二叉树 101. 对称二叉树
    226.翻转二叉树题目:给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。示例1:输入:root=[4,2,7,1,3,6,9]输出:[4,7,2,9,6,3,1]示例2:输入:root=[2,1,3]输出:[2,3,1]示例3:输入:root=[]输出:[]提示:树中节点数目范围在 [0,100] 内-100<=......
  • 25版王道数据结构课后习题详细分析 第五章 树与二叉树 5.1 树的基本概念
     一、单项选择题————————————————————————————————————————解析:树是一种分层结构,它特别适合组织那些具有分支层次关系的数据。正确答案:D————————————————————————————————————————解......
  • 代码随想录算法训练营第十三天|二叉树理论基础,144.二叉树的前序遍历,145.二叉树的中序
    day12周日放假二叉树理论基础:文章链接:代码随想录文章摘要:满二叉树定义:如果一棵二叉树只有度为0的结点和度为2的结点,并且度为0的结点在同一层上,则这棵二叉树为满二叉树。完全二叉树定义:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一......