原题链接在这里:https://leetcode.com/problems/binary-tree-postorder-traversal/
题目:
Given a binary tree, return the postorder traversal of its nodes' values.
For example:
Given binary tree {1,#,2,3}
,
1 2 / 3
return [3,2,1]
.
Note: Recursive solution is trivial, could you do it iteratively?
题解:
类似Binary Tree Inorder Traversal 和 Binary Tree Preorder Traversal.
Method 1: Recursion
Time Complexity: O(n). Space: O(logn).
AC Java:
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 public class Solution { 11 //Method 1: Recursion 12 public List<Integer> postorderTraversal(TreeNode root) { 13 //Recursion 14 List<Integer> ls = new ArrayList<Integer>(); 15 helper(root,ls); 16 17 return ls; 18 } 19 private void helper(TreeNode root,List<Integer> ls){ 20 if(root == null){ 21 return; 22 } 23 helper(root.left,ls); 24 helper(root.right,ls); 25 ls.add(root.val); 26 } 27 }
Method 2:
Pretty much like method 2 of Binary Tree Preorder Traversal.
The difference is that when pushing into stack, push from left to right.
Time Complexity: O(n).
Space: O(logn).
AC Java:
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 class Solution { 11 public List<Integer> postorderTraversal(TreeNode root) { 12 List<Integer> res = new ArrayList<>(); 13 if(root == null){ 14 return res; 15 } 16 17 Stack<TreeNode> stk = new Stack<>(); 18 stk.push(root); 19 while(!stk.isEmpty()){ 20 TreeNode cur = stk.pop(); 21 res.add(cur.val); 22 if(cur.left != null){ 23 stk.push(cur.left); 24 } 25 26 if(cur.right != null){ 27 stk.push(cur.right); 28 } 29 } 30 31 Collections.reverse(res); 32 return res; 33 } 34 }
Method 3: Iteration + Stack
和Preorder, Inorder 类似.
当栈顶点右侧为空 或者 右侧已经traverse 过了, 就可以把栈顶的点加入res中. 节点pre用来记载刚刚加入res的点, 可以用来判定右侧是否已经traverse过了.
top.right == pre 说明right已经加入res里了.
Time Complexity: O(n), 每个点访问了一次. Space:O(logn).
AC Java:
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 class Solution { 11 public List<Integer> postorderTraversal(TreeNode root) { 12 List<Integer> res = new ArrayList<Integer>(); 13 Stack<TreeNode> stk = new Stack<TreeNode>(); 14 TreeNode pre = null; 15 while(root != null || !stk.isEmpty()){ 16 if(root != null){ 17 stk.push(root); 18 root = root.left; 19 }else{ 20 TreeNode top = stk.peek(); 21 if(top.right == null || top.right == pre){ 22 res.add(top.val); 23 stk.pop(); 24 pre = top; 25 }else{ 26 root = top.right; 27 } 28 } 29 } 30 return res; 31 } 32 }