Preorder, Inorder, and Postorder Iteratively Summarization[1]
1.Pre Order Traverse
1 public List<Integer> preorderTraversal(TreeNode root) {
2 List<Integer> result = new ArrayList<>();
3 Deque<TreeNode> stack = new ArrayDeque<>();
4 TreeNode p = root;
5 while(!stack.isEmpty() || p != null) {
6 if(p != null) {
7 stack.push(p);
8 result.add(p.val); // Add before going to children
9 p = p.left;
10 } else {
11 TreeNode node = stack.pop();
12 p = node.right;
13 }
14 }
15 return result;
16 }
2.In Order Traverse
1 public List<Integer> inorderTraversal(TreeNode root) {
2 List<Integer> result = new ArrayList<>();
3 Deque<TreeNode> stack = new ArrayDeque<>();
4 TreeNode p = root;
5 while(!stack.isEmpty() || p != null) {
6 if(p != null) {
7 stack.push(p);
8 p = p.left;
9 } else {
10 TreeNode node = stack.pop();
11 result.add(node.val); // Add after all left children
12 p = node.right;
13 }
14 }
15 return result;
16 }
3.Post Order Traverse
1 public List<Integer> postorderTraversal(TreeNode root) {
2 LinkedList<Integer> result = new LinkedList<>();
3 Deque<TreeNode> stack = new ArrayDeque<>();
4 TreeNode p = root;
5 while(!stack.isEmpty() || p != null) {
6 if(p != null) {
7 stack.push(p);
8 result.addFirst(p.val); // Reverse the process of preorder
9 p = p.right; // Reverse the process of preorder
10 } else {
11 TreeNode node = stack.pop();
12 p = node.left; // Reverse the process of preorder
13 }
14 }
15 return result;
16 }