145. 二叉树的后序遍历

问题描述

给定一个二叉树,返回它的 后序 遍历。

示例

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

输出: [3,2,1]

思路

非递归遍历先序最简单,为啥呢?因为对于一个结点不用判断它是从哪里来的。
中序的话难一些,因为要判断是从左子树来的还是右子树来的。后续最难,因为它要判定是不是左右子树都遍历过了。
对于遍历过没遍历过,我们完全可以用一个set来记录一下,费不了多大劲,真的。这样我们就能很方便的知道程序该怎么走。

方法一

class Solution {
    public List<Integer> postorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<>();
        if(root == null) return res;
        // set记录访问过没有
        Set<TreeNode> set = new HashSet<>();
        Stack<TreeNode> stack = new Stack<>();
        stack.push(root);
        while(!stack.isEmpty()){
            TreeNode tmp = stack.peek();
            // 判定是从子树回来的还是新加的
            boolean isVisited = false;
            if(set.contains(tmp.left) || set.contains(tmp.right) || (tmp.left == null && tmp.right == null)) isVisited = true;
            if(isVisited){
                // 从子树来的
                // 访问过怎么办
                set.add(tmp);
                res.add(stack.pop().val);
            }else{
                // 没有访问过怎么办
                // 新加的
                if(tmp.right != null) stack.add(tmp.right);
                if(tmp.left != null) stack.add(tmp.left);
            }
        }
        return res;
    }
}

你可能感兴趣的:(leetcode困难题)