-
Notifications
You must be signed in to change notification settings - Fork 3
/
13_binary_tree_construct_from_inorder_&_postorder_traversal.py
79 lines (59 loc) · 2 KB
/
13_binary_tree_construct_from_inorder_&_postorder_traversal.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
class ConstructBinaryTree:
# Time Complexity O(n^2)
def buildTree1(self, inorder: list[int], postorder: list[int]) -> 'TreeNode':
if not postorder or not inorder:
return None
root = TreeNode(postorder.pop())
idx = inorder.index(root.val)
root.right = self.buildTree1(inorder[idx + 1:], postorder)
root.left = self.buildTree1(inorder[:idx], postorder)
return root
# Time Complexity O(n)
def buildTree2(self, inorder: list[int], postorder: list[int]) -> 'TreeNode':
def buildTreeHelper(left, right):
if left > right:
return None
rootVal = postorder.pop()
rootNode = TreeNode(rootVal)
idx = inorderIndexMap[rootVal]
rootNode.right = buildTreeHelper(idx + 1, right)
rootNode.left = buildTreeHelper(left, idx - 1)
return rootNode
inorderIndexMap = {}
for (i, val) in enumerate(inorder):
inorderIndexMap[val] = i
return buildTreeHelper(0, len(postorder) - 1)
def print_tree(root):
if not root:
return []
result = []
queue = [root]
while queue:
node = queue.pop(0)
if node:
result.append(node.val)
queue.append(node.left)
queue.append(node.right)
else:
result.append(None)
# Remove trailing None values
while result and result[-1] is None:
result.pop()
return result
if __name__ == "__main__":
builder = ConstructBinaryTree()
postorder1 = [9,15,7,20,3]
inorder1 = [9,3,15,20,7]
root1 = builder.buildTree2(inorder1, postorder1)
result1 = print_tree(root1)
print(result1)
postorder2 = [-1]
inorder2 = [-1]
root2 = builder.buildTree1(inorder2, postorder2)
result2 = print_tree(root2)
print(result2)