Postorder: first, visit left child, then, parent, last, is to visit right child.
The postorder traversal result of above tree is {4,6,5,2,3,1}.
Key different here is that we print right child before we print parent node. Therefore, we need a mark for parent node. Only when its left child and right child are both printed, it can be printed out.
1 /** 2 * Definition for a binary tree node. 3 * public class TreeNode { 4 * int val; 5 * TreeNode left; 6 * TreeNode right; 7 * TreeNode(int x) { val = x; } 8 * } 9 */ 10 11 class MarkTreeNode { 12 TreeNode node; 13 int mark; 14 MarkTreeNode(TreeNode n, int x) { node = n; mark = x; } 15 } 16 17 public class Solution { 18 public List<Integer> postorderTraversal(TreeNode root) { 19 List<Integer> path = new ArrayList<Integer>(); 20 Deque<MarkTreeNode> stack = new ArrayDeque<MarkTreeNode>(); 21 TreeNode p = root; 22 MarkTreeNode m = null; 23 while (p != null || !stack.isEmpty()) { 24 while (p != null) { 25 m = new MarkTreeNode(p, 1); 26 stack.push(m); 27 p = p.left; 28 } 29 if (!stack.isEmpty()) { 30 m = stack.peek(); 31 if (m.mark == 1) { 32 p = m.node.right; 33 m.mark = 2; 34 } else { // m.mark == 2 35 stack.pop(); 36 path.add(m.node.val); 37 } 38 } 39 } 40 return path; 41 } 42 }