Skip to content

Commit dc8725f

Browse files
author
applewjg
committed
Binary Tree Postorder Traversal
Change-Id: I14aeed7075fb90bace971602710e62155f2136d6
1 parent 02b4f8c commit dc8725f

File tree

1 file changed

+104
-0
lines changed

1 file changed

+104
-0
lines changed

BinaryTreePostorderTraversal.java

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
/*
2+
Author: King, [email protected]
3+
Date: Nov 20, 2014
4+
Problem: Binary Tree Postorder Traversal
5+
Difficulty: Easy
6+
Source: http://oj.leetcode.com/problems/binary-tree-postorder-traversal/
7+
Notes:
8+
Given a binary tree, return the postorder traversal of its nodes' values.
9+
10+
For example:
11+
Given binary tree {1,#,2,3},
12+
1
13+
\
14+
2
15+
/
16+
3
17+
return [3,2,1].
18+
19+
Note: Recursive solution is trivial, could you do it iteratively?
20+
21+
Solution: 1. Iterative way (stack). Time: O(n), Space: O(n).
22+
2. Recursive solution. Time: O(n), Space: O(n).
23+
3. Threaded tree (Morris). Time: O(n), Space: O(n/1).
24+
Space: O(1) if in-place reverse.
25+
You may refer to my blog for more detailed explanations:
26+
http://www.cnblogs.com/AnnieKim/archive/2013/06/15/MorrisTraversal.html
27+
*/
28+
29+
30+
/**
31+
* Definition for binary tree
32+
* public class TreeNode {
33+
* int val;
34+
* TreeNode left;
35+
* TreeNode right;
36+
* TreeNode(int x) { val = x; }
37+
* }
38+
*/
39+
public class Solution {
40+
public List<Integer> postorderTraversal_1(TreeNode root) {
41+
List<Integer> res = new ArrayList<Integer>();
42+
if (root == null) return res;
43+
Stack<TreeNode> stk = new Stack<TreeNode>();
44+
TreeNode cur = root;
45+
TreeNode pre = null;
46+
while (stk.isEmpty() == false || cur != null) {
47+
if (cur != null) {
48+
stk.push(cur);
49+
cur = cur.left;
50+
} else {
51+
TreeNode peak = stk.peek();
52+
if (peak.right != null && pre != peak.right) {
53+
cur = peak.right;
54+
} else {
55+
res.add(peak.val);
56+
stk.pop();
57+
pre = peak;
58+
}
59+
}
60+
}
61+
return res;
62+
}
63+
public List<Integer> postorderTraversal_2(TreeNode root) {
64+
List<Integer> res = new ArrayList<Integer>();
65+
if (root == null) return res;
66+
List<Integer> left = postorderTraversal(root.left);
67+
List<Integer> right = postorderTraversal(root.right);
68+
res.addAll(left);
69+
res.addAll(right);
70+
res.add(root.val);
71+
return res;
72+
}
73+
public List<Integer> postorderTraversal_3(TreeNode root) {
74+
List<Integer> res = new ArrayList<Integer>();
75+
if (root == null) return res;
76+
Stack<Integer> stk = new Stack<Integer>();
77+
TreeNode dummy = new TreeNode(-1);
78+
dummy.left = root;
79+
TreeNode cur = dummy;
80+
while (cur != null) {
81+
if (cur.left == null) {
82+
cur = cur.right;
83+
} else {
84+
TreeNode node = cur.left;
85+
while (node.right != null && node.right != cur)
86+
node = node.right;
87+
if (node.right == null) {
88+
node.right = cur;
89+
cur = cur.left;
90+
} else {
91+
TreeNode temp = cur.left;
92+
while (temp != cur) {
93+
stk.push(temp.val);
94+
temp = temp.right;
95+
}
96+
while (stk.isEmpty() == false) res.add(stk.pop());
97+
node.right = null;
98+
cur = cur.right;
99+
}
100+
}
101+
}
102+
return res;
103+
}
104+
}

0 commit comments

Comments
 (0)