Skip to content

Commit af225f1

Browse files
committed
solve problem Binary Tree Postorder Traversal
1 parent 926dfe1 commit af225f1

File tree

5 files changed

+126
-0
lines changed

5 files changed

+126
-0
lines changed

README.md

+1
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ All solutions will be accepted!
4242
|389|[Find The Difference](https://leetcode-cn.com/problems/find-the-difference/description/)|[java/py/js](./algorithms/FindTheDifference)|Easy|
4343
|94|[Binary Tree Inorder Traversal](https://leetcode-cn.com/problems/binary-tree-inorder-traversal/description/)|[java/py/js](./algorithms/BinaryTreeInorderTraversal)|Medium|
4444
|144|[Binary Tree Preorder Traversal](https://leetcode-cn.com/problems/binary-tree-preorder-traversal/description/)|[java/py/js](./algorithms/BinaryTreePreorderTraversal)|Medium|
45+
|145|[Binary Tree Postorder Traversal](https://leetcode-cn.com/problems/binary-tree-postorder-traversal/description/)|[java/py/js](./algorithms/BinaryTreePostorderTraversal)|Hard|
4546

4647
# Database
4748
|#|Title|Solution|Difficulty|
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
# Binary Tree Postorder Traversal
2+
Use recursion can easy to solve this problem, like below:
3+
```
4+
# Definition for a binary tree node.
5+
# class TreeNode(object):
6+
# def __init__(self, x):
7+
# self.val = x
8+
# self.left = None
9+
# self.right = None
10+
11+
class Solution(object):
12+
def postorderTraversal(self, root):
13+
"""
14+
:type root: TreeNode
15+
:rtype: List[int]
16+
"""
17+
# left -> right -> root
18+
if not root:
19+
return []
20+
return self.postorderTraversal(root.left) + self.postorderTraversal(root.right) + [root.val]
21+
```
22+
But we have to use iteration to solve this problem, the stack and the hashmap is the solution
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
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+
List<TreeNode> stack = new ArrayList<TreeNode>();
14+
Map<TreeNode, Boolean> traveredLeftMap = new HashMap<TreeNode, Boolean>();
15+
Map<TreeNode, Boolean> traveredRightMap = new HashMap<TreeNode, Boolean>();
16+
17+
if (root == null) {
18+
return res;
19+
}
20+
21+
stack.add(root);
22+
23+
while (stack.size() > 0) {
24+
TreeNode node = stack.get(stack.size() - 1);
25+
if (node.left != null && traveredLeftMap.get(node) == null) {
26+
traveredLeftMap.put(node, true);
27+
stack.add(node.left);
28+
} else if (node.right != null && traveredRightMap.get(node) == null) {
29+
traveredRightMap.put(node, true);
30+
stack.add(node.right);
31+
} else {
32+
stack.remove(stack.size() - 1);
33+
res.add(node.val);
34+
}
35+
}
36+
37+
return res;
38+
}
39+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
/**
2+
* Definition for a binary tree node.
3+
* function TreeNode(val) {
4+
* this.val = val;
5+
* this.left = this.right = null;
6+
* }
7+
*/
8+
/**
9+
* @param {TreeNode} root
10+
* @return {number[]}
11+
*/
12+
var postorderTraversal = function(root) {
13+
if (!root) return []
14+
15+
let stack = [root],
16+
res = []
17+
18+
while (stack.length > 0) {
19+
let node = stack[stack.length - 1]
20+
if (node.left && node.traveredLeft === undefined) {
21+
node.traveredLeft = true
22+
stack.push(node.left)
23+
} else if (node.right && node.traveredRight === undefined) {
24+
node.traveredRight = true
25+
stack.push(node.right)
26+
} else {
27+
stack.pop()
28+
res.push(node.val)
29+
}
30+
}
31+
return res
32+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
# Definition for a binary tree node.
2+
# class TreeNode(object):
3+
# def __init__(self, x):
4+
# self.val = x
5+
# self.left = None
6+
# self.right = None
7+
8+
class Solution(object):
9+
def postorderTraversal(self, root):
10+
"""
11+
:type root: TreeNode
12+
:rtype: List[int]
13+
"""
14+
# left -> right -> root
15+
if not root:
16+
return []
17+
stack = [root]
18+
travered_left_map = {}
19+
travered_right_map = {}
20+
res = []
21+
while len(stack) > 0:
22+
node = stack[-1]
23+
if node.left and travered_left_map.get(node) == None:
24+
travered_left_map[node] = True
25+
stack.append(node.left)
26+
elif node.right and travered_right_map.get(node) == None:
27+
travered_right_map[node] = True
28+
stack.append(node.right)
29+
else:
30+
stack.pop()
31+
res.append(node.val)
32+
return res

0 commit comments

Comments
 (0)