[Leetcode] Binary Tree Postorder Traversal

Problem statement:

Thought: Since TreeNode has a self-recursive structure, it's very natural and easy to come up with a recursive implement. But the tricky part is how to implement this using a iterative method. The three binary tree traversal methods: pre-order, in-order and post-order can all be regarded as Depth First Search, and we know the iterative version of DFS makes use of a stack. So maybe we can also use a stack to solve this problem.

Because this problem is postorder, the relative position of node, left subtree, right subtree should be like this:

In-order traversal is similar, siwtching position of Right and Node in the above picture.

Pre-order is the simplest of three, just run iterative-DFS on the root node.

public class Binary_tree_postorder_traversal {

    public ArrayList<Integer> postorderTraversal(TreeNode root) {
        ArrayList<Integer> list = new ArrayList<Integer>();
        if(root == null){
            return list;
        }
        
        Stack<StatusNode> stack = new Stack<StatusNode>();
        stack.push(new StatusNode(root, true));
        stack.push(new StatusNode(root.right, false));
        stack.push(new StatusNode(root.left, false));
        
        while(!stack.isEmpty()){
            StatusNode node = stack.peek();
            if(node.internalNode == null){
                stack.pop();
                continue;
            }
            if(node.finished){
                list.add(stack.pop().internalNode.val);
                
            }else{
                stack.push(new StatusNode(node.internalNode.right, false));
                stack.push(new StatusNode(node.internalNode.left, false));
                node.finished = true;
            }
        }
        return list;
    }

}


class StatusNode{
    boolean finished;// if true, just output it, otherwise expand it
    TreeNode internalNode;
    
    public StatusNode(TreeNode node, boolean finished){
        this.internalNode = node;
        this.finished = finished;
    }
}
原文地址:https://www.cnblogs.com/Antech/p/3655594.html