145. 二叉树的后序遍历

小豆丁 1年前 ⋅ 1003 阅读
145. 二叉树的后序遍历
给定一个二叉树,返回它的 后序 遍历。

示例:

输入: [1,null,2,3]  
   1
    \
     2
    /
   3 

输出: [3,2,1]
进阶: 递归算法很简单,你可以通过迭代算法完成吗?

解析

首先压入根节点,然后一直循环压入左子节点,然后如果没有右子节点或者右子节点已经访问过了就访问父亲节点。

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

        TreeNode node = root;
        List<Integer> ret = new ArrayList<Integer>();

        Stack<TreeNode> stack = new Stack<TreeNode>();
        while(node != null || !stack.isEmpty()) {
            while (node != null) {
                stack.push(node);
                node = node.left;
            }
            node = stack.pop();
            // 后序遍历
            // 如果没有右孩子或者右孩子被访问过了
            if (node.right == null ||
                    (ret.size() != 0 && ret.get(ret.size() - 1).equals(node.right.val)) ) {
                ret.add(node.val);
                node = null;
            }  else {
                stack.push(node);
                node = node.right;
            }
        }
        return ret;
    }
}