[Leetcode] Binary Tree Postorder Traversal

Problem statement:

[Leetcode] Binary Tree Postorder Traversal

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:

[Leetcode] Binary Tree Postorder Traversal

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;

    }

}

 

你可能感兴趣的:(LeetCode)