145. Binary Tree Postorder Traversal
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
if (root == null) {
return res;
}
postorderTraversal(root, res);
return res;
}
private void postorderTraversal(TreeNode root, List<Integer> res) {
if (root == null){
return;
}
postorderTraversal(root.left, res);
postorderTraversal(root.right, res);
res.add(root.val);
}
}
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
if (root == null) {
return res;
}
res.addAll(postorderTraversal(root.left));
res.addAll(postorderTraversal(root.right));
res.add(root.val);
return res;
}
}
Method1: Post-order is the reverse order of pre-order with traversing right subtree before traversing left subtree.
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
if (root == null) {
return res;
}
Deque<TreeNode> preOrder = new LinkedList<>(); // Stack
preOrder.offerFirst(root);
while (!preOrder.isEmpty()) {
TreeNode current = preOrder.pollFirst();
res.add(current.val);
if (current.left != null) {
preOrder.offerFirst(current.left);
}
if (current.right != null) {
preOrder.offerFirst(current.right);
}
}
Collections.reverse(res);
return res;
}
}
Method 2: Check the relation between the current node and the previous node to determine which direction should go next.
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
if (root == null) {
return res;
}
Deque<TreeNode> stack = new LinkedList<>();
stack.offerFirst(root);
TreeNode prev = null;
while (!stack.isEmpty()) {
TreeNode cur = stack.peekFirst();
if (prev == null || cur == prev.left || cur == prev.right) {
if (cur.left != null) {
stack.offerFirst(cur.left);
} else if (cur.right != null) {
stack.offerFirst(cur.right);
} else {
stack.pollFirst();
res.add(cur.val);
}
} else if (prev == cur.right || prev == cur.left && cur.right == null) {
stack.pollFirst();
res.add(cur.val);
} else {
stack.offerFirst(cur.right);
}
prev = cur;
}
return res;
}
}