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

Posted

tags:

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

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
 
 /* 伪代码:
    1. 栈初始化
    2. 循环直到root为空且栈为空
        2.1 当root非空时循环
            2.1.1 将root连同标志flag=1入栈
            2.1.2 继续遍历root的左子树
        2.2 当栈非空 且 栈顶元素flag=2时循环
            2.2.1 栈顶元素弹出至root
            2.2.2 输出root.val
            2.2.3 root置为空
        2.3 如果栈非空,则
            2.2.1 栈顶元素的标志flag改为2
            2.2.2 准备遍历栈顶结点的右子树
  */
class BiTreePostOrder {
    public List<Integer> postorderTraversal(TreeNode root) {
        List<Integer> result = new ArrayList<>();
        Deque<TreeNode> stack = new ArrayDeque<>();
        Deque<Integer> flag = new ArrayDeque<>();
        while(root!=null || stack.size()!=0) {
            while(root!=null) {
                stack.addFirst(root);
                flag.addFirst(1);
                root = root.left;
            }
            while(stack.size()!=0 && flag.peekFirst()==2) {
                root = stack.removeFirst();
                flag.removeFirst();
                result.add(root.val);
                root = null;    //重要!否则程序陷入死循环,永远跳不出外层while循环
            }
            if(stack.size()!=0) {
                flag.removeFirst();
                flag.addFirst(2);
                root = stack.peekFirst().right;
            }
        }
        return result;
    }
}

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

LeetCode 145. 二叉树的后序遍历 (用栈实现后序遍历二叉树的非递归算法)

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

二叉树的后序遍历(简单)

C语言数据结构,急求在线二叉树先序中序后序递归遍历

LintCode 68. 二叉树的后序遍历

leetcode145——二叉树的后序遍历序列(非递归解法)