美文网首页
二叉树的非递归遍历通用方法

二叉树的非递归遍历通用方法

作者: 执壹 | 来源:发表于2019-08-05 00:04 被阅读0次

在二叉树的非递归遍历上有很多种方法,但如果想要统一用一种通用方式来实现三者的非递归遍历还是很酷的.

树的结构
class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;

    TreeNode(int val) {
        this.val = val;
    }
}

递归遍历

递归遍历很简单,这是leetcode144的题

class Solutiont144 {
    ArrayList<Integer> res = new ArrayList<>();
    public List<Integer> preorderTraversal(TreeNode root) {
        if (root != null) {
            //递归模式只需要改变res.add的位置
            res.add(root.val);
            preorderTraversal(root.left);
            preorderTraversal(root.right);
        }
        return res;
    }
}

非递归遍历

借用Guide这个类,我习惯称之为"指令",在栈中压入一个"操作".

class generalPrintTree {
    public List<Integer> preorderTraversal(TreeNode root) {
        ArrayList<Integer> res = new ArrayList<>();
        Stack<Guide> path = new Stack<>();

        path.push(new Guide(0, root));
        while (!path.isEmpty()) {
            Guide cur = path.pop();
            if (cur.node == null) continue;
            if (cur.ope == 1) { //当前指令是要输出,则输出(放到res里)
                res.add(cur.node.val);
            } else { //当前指令是要遍历这个node的子节点
                // 核心代码  ope = 1放在最后是前序, 1放在中间是中序, 1放在第一行是后序, 交换right和left位置可以是其他遍历方式
                path.push(new Guide(0, cur.node.right));
                path.push(new Guide(0, cur.node.left));
                path.push(new Guide(1, cur.node));
            }
        }
        return res;
    }

    class Guide {
        //Guide 可以认为是一个指令,这个指令里存有操作符ope 和node节点
        int ope = 0;  //0 ->visit, 1 ->print
        TreeNode node;

        public Guide(int ope, TreeNode node) {
            this.ope = ope;
            this.node = node;
        }
    }

}

以前序遍历为例:


image.png

而中序,后续遍历只要换核心的三行代码顺序就行了.准确的来说,如果只是前中后,那么只要换

 path.push(new Guide(1, cur.node));

这行代码就ok了.

相关文章

  • 深度优先遍历&广度优先遍历

    二叉树的[深度优先遍历的非递归的通用做法是采用栈,广度优先遍历的非递归的通用做法是采用队列 深度优先遍历中,具体分...

  • 二叉树的非递归遍历通用方法

    在二叉树的非递归遍历上有很多种方法,但如果想要统一用一种通用方式来实现三者的非递归遍历还是很酷的. 树的结构 递归...

  • 前端面试考点之数据结构

    1、深度优先和广度优先的区别 1) 二叉树的深度优先遍历的非递归的通用做法是采用栈,广度优先遍历的非递归的通用做法...

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

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

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

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

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

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

  • 总结

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

  • 二叉树遍历

    二叉树的遍历 1. 前序遍历 1.1 递归前序遍历 1.2 非递归前序遍历 2 中序遍历 2.1递归遍历 2.2非...

  • 二叉树遍历(先序、中序、后序)

    二叉树有多种遍历方法,有层次遍历、深度优先遍历、广度优先遍历等。 本文只涉及二叉树的先序、中序、后序的递归和非递归...

  • 二叉树非递归遍历(先序、中序、后序)

    二叉树有多种遍历方法,有层次遍历、深度优先遍历、广度优先遍历等。 本文只涉及二叉树的先序、中序、后序的递归和非递归...

网友评论

      本文标题:二叉树的非递归遍历通用方法

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