[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; } }