美文网首页
二叉树递归遍历

二叉树递归遍历

作者: 蓝笔头 | 来源:发表于2021-09-10 08:44 被阅读0次

生成二叉树的工具,参考:构建二叉树
打印二叉树的工具类,参考:打印二叉树

1. 入栈/出栈顺序

1)打印【入栈】/【出栈】操作工具类

public class BinaryTreeStackPrinter {

    public static void recursivePrint(TreeNode root) {
        recursivePrint(root, new Stack<>());
    }

    private static void recursivePrint(TreeNode root, Stack<Integer> stack) {
        if (root == null) return;

        stack.push(root.val);
        System.out.println(root.val + " 【入栈】                   | " + stack);

        recursivePrint(root.left, stack);
        recursivePrint(root.right, stack);

        stack.pop();
        System.out.println("----------" + root.val + "【出栈】          | " + stack);
    }
}

2)构造二叉树进行打印

public class BinaryTreeDemo {
    public static void main(String[] args) {
        TreeNode root = new BinaryTreeBuilder(3).build();
        BinaryTreePrinter.print(root);
        BinaryTreeStackPrinter.recursivePrint(root);
    }
}

控制台输出:

maxLevel: 3
level[1] 节点宽度[ 16]===|          1       
                     ===|      ┌───┴───┐   
level[2] 节点宽度[  8]===|      2       5   
                     ===|    ┌─┴─┐   ┌─┴─┐ 
level[3] 节点宽度[  4]===|    3   4   6   7 
1 【入栈】                   | [1]
2 【入栈】                   | [1, 2]
3 【入栈】                   | [1, 2, 3]
----------3【出栈】          | [1, 2]
4 【入栈】                   | [1, 2, 4]
----------4【出栈】          | [1, 2]
----------2【出栈】          | [1]
5 【入栈】                   | [1, 5]
6 【入栈】                   | [1, 5, 6]
----------6【出栈】          | [1, 5]
7 【入栈】                   | [1, 5, 7]
----------7【出栈】          | [1, 5]
----------5【出栈】          | [1]
----------1【出栈】          | []

三种遍历方式

public class BinaryTreeStackPrinter {

    public static void print(TreeNode root) {
        print(root, new Stack<>());
    }

    private static void print(TreeNode root, Stack<Integer> stack) {
        if (root == null) return;

        stack.push(root.val);
        System.out.println(root.val + " 【入栈】                   | " + stack);

//        System.out.println("【前序遍历】" + root.val);

        print(root.left, stack);

//        System.out.println("【中序遍历】" + root.val);

        print(root.right, stack);

        stack.pop();
        System.out.println("----------" + root.val + "【出栈】          | " + stack);

//        System.out.println("【后序遍历】" + root.val);
    }
}
  • 前序遍历输出:
maxLevel: 3
level[1] 节点宽度[ 16]===|          1       
                     ===|      ┌───┴───┐   
level[2] 节点宽度[  8]===|      2       5   
                     ===|    ┌─┴─┐   ┌─┴─┐ 
level[3] 节点宽度[  4]===|    3   4   6   7 
1 【入栈】                   | [1]
【前序遍历】1
2 【入栈】                   | [1, 2]
【前序遍历】2
3 【入栈】                   | [1, 2, 3]
【前序遍历】3
----------3【出栈】          | [1, 2]
4 【入栈】                   | [1, 2, 4]
【前序遍历】4
----------4【出栈】          | [1, 2]
----------2【出栈】          | [1]
5 【入栈】                   | [1, 5]
【前序遍历】5
6 【入栈】                   | [1, 5, 6]
【前序遍历】6
----------6【出栈】          | [1, 5]
7 【入栈】                   | [1, 5, 7]
【前序遍历】7
----------7【出栈】          | [1, 5]
----------5【出栈】          | [1]
----------1【出栈】          | []

观察可得,前序遍历就是在【入栈】时,访问【入栈节点】。

  • 中序遍历
maxLevel: 3
level[1] 节点宽度[ 16]===|          1       
                     ===|      ┌───┴───┐   
level[2] 节点宽度[  8]===|      2       5   
                     ===|    ┌─┴─┐   ┌─┴─┐ 
level[3] 节点宽度[  4]===|    3   4   6   7 
1 【入栈】                   | [1]
2 【入栈】                   | [1, 2]
3 【入栈】                   | [1, 2, 3]
【中序遍历】3
----------3【出栈】          | [1, 2]
【中序遍历】2
4 【入栈】                   | [1, 2, 4]
【中序遍历】4
----------4【出栈】          | [1, 2]
----------2【出栈】          | [1]
【中序遍历】1
5 【入栈】                   | [1, 5]
6 【入栈】                   | [1, 5, 6]
【中序遍历】6
----------6【出栈】          | [1, 5]
【中序遍历】5
7 【入栈】                   | [1, 5, 7]
【中序遍历】7
----------7【出栈】          | [1, 5]
----------5【出栈】          | [1]
----------1【出栈】          | []

观察可得,中序遍历就是在【遍历右子树】之前,访问【栈顶节点】。

注意:访问过的节点不需要再访问。

如果【右子树节点】被访问过,说明当前【栈顶节点】已经被访问过了

  • 后序遍历
maxLevel: 3
level[1] 节点宽度[ 16]===|          1       
                     ===|      ┌───┴───┐   
level[2] 节点宽度[  8]===|      2       5   
                     ===|    ┌─┴─┐   ┌─┴─┐ 
level[3] 节点宽度[  4]===|    3   4   6   7 
1 【入栈】                   | [1]
2 【入栈】                   | [1, 2]
3 【入栈】                   | [1, 2, 3]
----------3【出栈】          | [1, 2]
【后序遍历】3
4 【入栈】                   | [1, 2, 4]
----------4【出栈】          | [1, 2]
【后序遍历】4
----------2【出栈】          | [1]
【后序遍历】2
5 【入栈】                   | [1, 5]
6 【入栈】                   | [1, 5, 6]
----------6【出栈】          | [1, 5]
【后序遍历】6
7 【入栈】                   | [1, 5, 7]
----------7【出栈】          | [1, 5]
【后序遍历】7
----------5【出栈】          | [1]
【后序遍历】5
----------1【出栈】          | []
【后序遍历】1

观察可得,后序遍历就是在【出栈】时,访问【出栈节点】。

相关文章

  • 二叉树遍历-JAVA实现

    基础二叉树 二叉树遍历分为前序、中序、后序递归和非递归遍历、还有层序遍历。 前序递归遍历算法:访问根结点-->递归...

  • 二叉树递归非递归遍历算法整理

    一、二叉树前序遍历 1 前序递归遍历 2.前序非递归遍历 一、二叉树中序遍历 2.中序递归遍历 1.中序非递归遍历...

  • 二叉树遍历java,非递归、层次。

    /** * 前序遍历 * 递归 */ /*** 前序遍历* 非递归*/ 后续遍历非递归 二叉树层次遍历基于java...

  • 数据结构之二叉树

    数据结构之二叉树 递归构造二叉树 二叉树节点: 递归构造: 图示: 递归遍历 递归实现先序遍历 图示: 递归实现中...

  • 深入浅出二叉树遍历的非递归算法 2019-11-15(未经允许,

    1、二叉树遍历的递归算法 递归实现二叉树的遍历非常直观,回顾一下递归的代码: 前序遍历 中序遍历 后序遍历 他们的...

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

    1. 二叉树的定义 构造二叉树 2. 二叉树的递归遍历 2.1 二叉树递归先序遍历 2.2 二叉树递归中序遍历 2...

  • 算法-二叉树算法总结

    二叉树算法总结 1 二叉树的遍历 1.1 前序遍历 递归 迭代 1.2 中序遍历 递归 迭代 1.3 后序遍历 递...

  • 二叉树遍历

    请递归,非递归方式分别前序遍历,中序遍历,后续遍历二叉树

  • 二叉树,非递归法

    递归法 二叉树的递归,有前序遍历、中序遍历、后序遍历,一般采用递归法,比较简单 非递归法 二叉树非递归法,采用栈来实现

  • 总结

    1、二叉树广度遍历(非递归) 广度遍历非递归实现需要依靠一个队列。 2、二叉树深度遍历(递归与非递归,前序,中序和...

网友评论

      本文标题:二叉树递归遍历

      本文链接:https://www.haomeiwen.com/subject/oagvwltx.html