美文网首页
二叉树的前中后序遍历(递归,非递归版)

二叉树的前中后序遍历(递归,非递归版)

作者: lkuuuuuun | 来源:发表于2019-08-03 11:43 被阅读0次

二叉树的深度遍历,是面试考验面试者最基本的算法功底,让我们一起再温习一遍。


二叉树.png

前序遍历:遍历顺序为根节点-> 左子树-> 右子树 4 2 1 3 6 5 7
中序遍历: 遍历顺序为 左子树-> 根节点 -> 右子树 1 2 3 4 5 6 7
后序遍历:遍历顺序为 左子树-> 右子树-> 根节点 1 3 2 5 7 6 4

二叉树定义:

public class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;
    // TreeNode parent;
    public TreeNode(int val) {
        this.val = val;
    }
}

我们先看看递归版该如何遍历

    // 前序遍历  遍历顺序为根节点-> 左子树-> 右子树
    public static void preOrder(TreeNode node) {
        if (node != null) {
            System.out.print(node.val+" ");
            preOrder(node.left);
            preOrder(node.right);
        }

    }
    // 中序遍历  遍历顺序为 左子树-> 根节点 -> 右子树
    public static void inOrder(TreeNode node) {
        if (node != null) {
            inOrder(node.left);
            System.out.print(node.val+" ");
            inOrder(node.right);
        }
    }
    // 后序遍历 遍历顺序为 左子树-> 右子树-> 根节点
    public static void postOrder(TreeNode node) {
        if (node != null) {
            postOrder(node.left);
            postOrder(node.right);
            System.out.print(node.val+" ");
        }
    }

非递归版:二叉树的深度遍历 一般借助于栈先进后出的特性进行遍历

    // 前序遍历非递归版
    public static void preOrderNonRecursion(TreeNode node) {
        Stack<TreeNode> stack = new Stack();
        while (node != null || !stack.isEmpty()) {
            if (node != null) {
                stack.push(node);
                System.out.println(node.val);
                node = node.left;
            } else {
                node = stack.pop();
                node = node.right;
            }
        }
    }
    // 中序遍历非递归版
    public static void inOrderNonRecursion(TreeNode node) {

        Stack<TreeNode> stack = new Stack<>();
        while (node != null || !stack.isEmpty()) {
            if (node != null) {
                stack.push(node);
                node = node.left;
            } else {
                node = stack.pop();
                System.out.println(node.val);
                node = node.right;
            }
        }
    }
    // 后序遍历非递归版
    public static void postOrderNonRecursion(TreeNode node) {

        TreeNode lastVisit = node; // 用变量记录右子树是否已经遍历
        Stack<TreeNode> stack = new Stack<>();
        while (node != null || !stack.isEmpty()) {
            while (node != null) {
                stack.push(node);
                node = node.left;
            }
            node = stack.peek();
            // 如果没有右子树或者右子树已经遍历 则可以输出该节点
            if (node.right == null || node.right == lastVisit) {
                stack.pop();
                System.out.println(node.val);
                lastVisit = node;
                node = null;
            } else
                // 否则处理右子树
                node = node.right;
        }
    }

相关文章

  • 左神算法笔记——Morris遍历

    基本问题——实现二叉树的前序、中序、后序遍历 (递归、非递归,mirros方法) 递归 递归方式下的前中后遍历 非...

  • goLang 二叉树遍历(递归 非递归 前序遍历 中序遍历 后序

    goLang 二叉树遍历(递归 非递归 前序遍历 中序遍历 后序遍历 层序遍历) 前序遍历 中序遍历 后序遍历 代...

  • 二叉树先序、 中序, 后序遍历的非递归,非递归实现

    递归版的先序,中序,后序 非递归版的遍历

  • 二叉树遍历

    先序遍历——[递归、非递归] 中序遍历——[递归、非递归] 后序遍历——[递归、非递归] 层次遍历——[递归、非递归]

  • Morris遍历二叉树

    前言 对于二叉树的遍历,递归的前、中、后序遍历可以说是最经典、最简单的,其次,非递归版的就是手动压栈的方式模拟递归...

  • 二叉树遍历-JAVA实现

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

  • 二叉树,非递归法

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

  • 树的遍历,golang实现

    先序,递归 中序,递归 后序,递归 先序,非递归 中序,非递归 后序,非递归 层序遍历

  • 算法之二叉树

    二叉树之C++实现 创建二叉树 复制二叉树 先序遍历 递归实现 非递归实现 中序遍历 递归实现 非递归实现 后序遍...

  • 二叉树的遍历

    先序递归: 非递归: 中序递归: 非递归: 后序递归: 非递归 层次遍历

网友评论

      本文标题:二叉树的前中后序遍历(递归,非递归版)

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