【数据结构|二叉树遍历】递归与非递归实现前序遍历、中序遍历、后序遍历

这篇具有很好参考价值的文章主要介绍了【数据结构|二叉树遍历】递归与非递归实现前序遍历、中序遍历、后序遍历。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

递归与非递归实现二叉树的前序遍历、中序遍历、后序遍历。

二叉树图

【数据结构|二叉树遍历】递归与非递归实现前序遍历、中序遍历、后序遍历,架构师之路,数据结构,java,递归,二叉树遍历

定义

  1. 前序遍历(Preorder Traversal): 前序遍历的顺序是先访问根节点,然后按照先左后右的顺序访问子节点。对于上面的二叉树,前序遍历的结果是:4 -> 2 -> 1 -> 3 -> 6 -> 5 -> 7。

  2. 中序遍历(Inorder Traversal): 中序遍历的顺序是按照先左后根再右的顺序访问子节点。对于上面的二叉树,中序遍历的结果是:1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7。

  3. 后序遍历(Postorder Traversal): 后序遍历的顺序是按照先左后右再根的顺序访问子节点。对于上面的二叉树,后序遍历的结果是:1 -> 3 -> 2 -> 5 -> 7 -> 6 -> 4。

通俗易懂

【数据结构|二叉树遍历】递归与非递归实现前序遍历、中序遍历、后序遍历,架构师之路,数据结构,java,递归,二叉树遍历

如果上面的定义看着有点晕,看这里,如上图,在这三个节点中,观察根节点2的遍历位置

前序遍历:213

中序遍历:123

后序遍历:132

总结:不管哪个遍历方式,左右相比,都是左先,1在前,3在后,根节点2依次是前、中、后,递归时把子树看成整体,逻辑同理。

代码

public class BinaryTree {

    public static void main(String[] args) {
        int[] nums = {1, 2, 3, 4, 5, 6, 7};
        TreeNode root = TreeNode.buildTree(nums);
        System.out.print("前序遍历(递归):");
        preorderTraversal(root);
        System.out.println();
        System.out.print("中序遍历(递归):");
        inorderTraversal(root);
        System.out.println();
        System.out.print("后序遍历(递归):");
        postorderTraversal(root);
        System.out.println();

        System.out.print("前序遍历(栈):");
        preorderTraversal1(root);
        System.out.println();
        System.out.print("中序遍历(栈):");
        inorderTraversal1(root);
        System.out.println();
        System.out.print("后序遍历(栈):");
        postorderTraversal1(root);
        System.out.println();
    }

    //前序遍历(递归)
    public static void preorderTraversal(TreeNode root) {
        if (root == null) {
            return;
        }
        System.out.print(root.val + " "); // 访问根节点
        preorderTraversal(root.left); // 访问左子树
        preorderTraversal(root.right); // 访问右子树
    }

    // 中序遍历(递归)
    public static void inorderTraversal(TreeNode root) {
        if (root == null) {
            return;
        }
        inorderTraversal(root.left); // 访问左子树
        System.out.print(root.val + " "); // 访问根节点
        inorderTraversal(root.right); // 访问右子树
    }

    // 后序遍历(递归)
    public static void postorderTraversal(TreeNode root) {
        if (root == null) {
            return;
        }
        postorderTraversal(root.left); // 访问左子树
        postorderTraversal(root.right); // 访问右子树
        System.out.print(root.val + " "); // 访问根节点
    }


    // 前序遍历(栈)
    public static void preorderTraversal1(TreeNode root) {
        if (root == null) {
            return;
        }
        Stack<TreeNode> stack = new Stack<>();
        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); // 再将左子节点入栈
            }
        }
    }

    // 中序遍历(栈)
    public static void inorderTraversal1(TreeNode root) {
        if (root == null) {
            return;
        }
        Stack<TreeNode> stack = new Stack<>();
        TreeNode node = root;
        while (node != null || !stack.isEmpty()) {
            while (node != null) {
                stack.push(node);
                node = node.left; // 先将左子节点入栈
            }
            node = stack.pop();
            System.out.print(node.val + " "); // 打印当前节点的值
            node = node.right; // 再处理右子节点
        }
    }

    // 后序遍历(栈)
    public static void postorderTraversal1(TreeNode root) {
        if (root == null) {
            return;
        }
        Stack<TreeNode> stack1 = new Stack<>();
        Stack<TreeNode> stack2 = new Stack<>();
        stack1.push(root);
        while (!stack1.isEmpty()) {
            TreeNode node = stack1.pop();
            if (node.left != null) {
                stack1.push(node.left); // 先将左子节点入栈
            }
            if (node.right != null) {
                stack1.push(node.right); // 再将右子节点入栈
            }
            stack2.push(node); // 将当前节点入栈(用于后序遍历)
        }
        while (!stack2.isEmpty()) {
            System.out.print(stack2.pop().val + " "); // 打印栈中的节点值(即后序遍历结果)
        }
    }
}
TreeNode 
public class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;
    TreeNode(int x) { val = x; }

    // 构建二叉树
    public static TreeNode buildTree(int[] nums) {
        if (nums == null || nums.length == 0) {
            return null;
        }
        return buildTree(nums, 0, nums.length - 1);
    }

    private static TreeNode buildTree(int[] nums, int left, int right) {
        if (left > right) {
            return null;
        }
        int mid = (left + right) / 2;
        TreeNode root = new TreeNode(nums[mid]);
        root.left = buildTree(nums, left, mid - 1);
        root.right = buildTree(nums, mid + 1, right);
        return root;
    }
}

 

运行结果

前序遍历(递归):4 2 1 3 6 5 7 
中序遍历(递归):1 2 3 4 5 6 7 
后序遍历(递归):1 3 2 5 7 6 4 
前序遍历(栈):4 2 1 3 6 5 7 
中序遍历(栈):1 2 3 4 5 6 7 
后序遍历(栈):1 3 2 5 7 6 4  文章来源地址https://www.toymoban.com/news/detail-626073.html

到了这里,关于【数据结构|二叉树遍历】递归与非递归实现前序遍历、中序遍历、后序遍历的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java 数据结构篇-二叉树的深度优先遍历(实现:递归方式、非递归方式)

    🔥博客主页: 【 小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍    文章目录         1.0 二叉树的说明         1.1 二叉树的实现         2.0 二叉树的优先遍历说明         3.0 用递归方式实现二叉树遍历         3.1 用递归方式实现遍历 - 前序遍历         3.2 用递归

    2024年02月05日
    浏览(40)
  • 【Java数据结构】二叉树的前中后序遍历(递归和非递归)

    二叉树遍历是二叉树的一种重要操作 必须要掌握 二叉树的遍历可以用递归和非递归两种做法来实现 前序遍历的遍历方式是 先根节点 在左节点 在右节点 述这棵树前序遍历的结果是: A B D E C F G 递归的思想就是把问题拆分成一个个小问题来解决 treeNode是一个内部类 具体实现

    2023年04月26日
    浏览(40)
  • 【算法与数据结构】二叉树的三种遍历代码实现(下)—— 非递归方式实现(大量图解)

     上篇: 【算法与数据结构】二叉树的三种遍历代码实现(上)—— 用递归序知识点讲解_Hacynn的博客-CSDN博客 https://blog.csdn.net/zzzzzhxxx/article/details/133609612?spm=1001.2014.3001.5502 目录 前言 1、先序遍历 1.1、详细图解描述 1.2、先序遍历非递归代码实现  2、中序遍历 2.1、详细图解描

    2024年02月08日
    浏览(28)
  • 【算法与数据结构】二叉树的三种遍历代码实现(上)—— 用递归序知识点讲解

      本篇博客 (上篇) 先带大家学习 递归方式 进行三种遍历, 而在后续的 (下篇) 中将为大家详细讲解非递归的三种遍历方式。 目录 1、二叉树 2、二叉树的递归遍历 2.1、先序遍历 2.2、中序遍历 2.3、后序遍历  二叉树(Binary tree)是树形结构的一个重要类型。许多实际问

    2024年02月08日
    浏览(31)
  • 二叉树的遍历的递归与非递归算法

    按照一定规律对二叉树的 每个结点进行访问且 仅访问一次 ; 这里的访问:可以是计算二叉树中的结点数据,打印该结点的信息,也可以是对结点进行的任何其它操作! 为什么需要遍历二叉树? 从过遍历可以得到访问结点的顺序序列,遍历操作就是将二叉树的结点按一定的

    2024年04月15日
    浏览(26)
  • 二叉树的遍历(先序遍历,中序遍历,后序遍历)递归与非递归算法

    先序遍历:先遍历一颗树的根节点,后遍历左子树,最后遍历右子树     先序遍历序列: 1 - 2 - 4 - 5 - 3 - 6 - 7 分解子问题方法 思路:将一颗二叉树看做两个部分,一个部分是左路节点,另一个部分是左路节点的右子树,先将二叉树的左路节点全部入栈,再依次出栈,出栈的

    2024年02月14日
    浏览(27)
  • 数据结构-二叉树-二叉树左右孩子交换(递归)

     注:本文采用队列和递归的算法进行创建和层次遍历。同时不能采用BFS和DFS,因为需要把当前根节点的左孩、右孩勾链并输入才能递归下一个根节点; 队列用于存储此时应该递归的根节点; 格式:每一行尾不能有空格; Description 根据输入利用二叉链表创建二叉树,并将所

    2024年02月04日
    浏览(37)
  • 【数据结构】二叉树<遍历>

    在学习二叉树遍历之前我们先了解下二叉树的概念。 二叉树是: 1.空树 2.非空:根节点,根节点的左子树,根节点的右子树构造。 学习二叉树结构,最简单的方式就是遍历了。 二叉树的遍历就是按照某种特定的规则,依次对二叉树中的结点进行相应的操作,并且每个节点只

    2023年04月11日
    浏览(44)
  • 数据结构:完全二叉树(递归实现)

           如果完全二叉树的深度为h,那么除了第h层外,其他层的节点个数都是满的,第h层的节点都靠左排列。        完全二叉树的编号方法是从上到下,从左到右,根节点为1号节点,设完全二叉树的节点数为sum,某节点编号为i,        当2*i = sum时,有左孩子,其编号为

    2024年01月24日
    浏览(38)
  • 【数据结构】二叉树的遍历

      Yan-英杰的主页 悟已往之不谏 知来者之可追    C++程序员,2024届电子信息研究生 目录 前序、中序以及后序遍历 前序遍历 中序遍历 后序遍历                  学习二叉树结构,最简单的方式就是遍历。所谓 二叉树遍历 (Traversal) 是按照某种特定的规则,依次对二叉

    2023年04月23日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包