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 ListpostorderTraversal(TreeNode root) {19 List path = new ArrayList ();20 Deque stack = new ArrayDeque ();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 == 235 stack.pop();36 path.add(m.node.val);37 }38 }39 }40 return path;41 }42 }