二叉树oj ——>后序遍历(非递归)

Posted ohana!

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树oj ——>后序遍历(非递归)相关的知识,希望对你有一定的参考价值。

题目要求:

 解题思路:

后序遍历相对来说比较麻烦一些,但是基本思路没有变

  • 从根节点的左子树开始,保存每一个不为空的结点
  • 当左子树为空时,获取栈顶元素(不是取出!!!),有可能这个结点的右子树不为空,因此判断右子树若不为空,让这个结点继续进行循环
  • 如果为空,就遍历这个结点,并将其出栈,
  • 当我们将上一步执行之后,发现,这个循环又回到了刚刚获取过了的这个结点,如此循环,就形成了死循环
  • 我们的原因是因为无法得知这个结点的值有没有打印,那么就给他添加一个标记,给上一个已经遍历了的结点加上标记,并且,多加一个判断即可

 解题代码:

class Solution {
    public List<Integer> postorderTraversal(TreeNode root) {
        List<Integer> list = new ArrayList<>();

        //如果是空树,直接返回
        if(root == null){
            return list;
        }

        Stack<TreeNode> s = new Stack<>();
        TreeNode cur = root;
        TreeNode prev = null;

        while(!s.empty() || cur != null){
            
            while(cur != null){
                s.push(cur);
                cur = cur.left;
            }

            TreeNode top = s.peek();
            if(top.right == null || top.right == prev){
                prev = top;
                list.add(top.val);
                s.pop();
            }else{
                cur = top.right;
            }
        }

        return list;
    }
}

以上是关于二叉树oj ——>后序遍历(非递归)的主要内容,如果未能解决你的问题,请参考以下文章

用递归算法先序中序后序遍历二叉树

二叉树的前中后序递归和非递归遍历操作代码

C++实现二叉树 前中后序遍历(递归与非递归)非递归实现过程最简洁版本

二叉树遍历(先序,中序,后序,层序)递归和非递归形式

二叉树的后序遍历(非递归)

二叉树的非递归遍历