Skip to content

Commit 1ec0ff0

Browse files
committed
build tree using traversals
1 parent e2a78d4 commit 1ec0ff0

File tree

1 file changed

+105
-0
lines changed

1 file changed

+105
-0
lines changed
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
# Binary Tree Node class
2+
class Node:
3+
def __init__(self, data):
4+
self.data = data
5+
self.left = None
6+
self.right = None
7+
8+
9+
# Normal inorder traversal
10+
def inorder(root, out):
11+
"""Perform inorder traversal and append values to 'out' list."""
12+
if root is None:
13+
return
14+
inorder(root.left, out)
15+
out.append(root.data)
16+
inorder(root.right, out)
17+
18+
19+
# === Build tree using PREORDER + INORDER ===
20+
def build_tree_from_pre(preorder, pre_start, pre_end,
21+
inorder_seq, in_start, in_end, in_map):
22+
"""Recursive helper to build tree from preorder and inorder traversal."""
23+
if pre_start > pre_end or in_start > in_end:
24+
return None
25+
26+
# Root is the first element in current preorder segment
27+
root_val = preorder[pre_start]
28+
root = Node(root_val)
29+
30+
# Find the root index in inorder traversal
31+
in_root_index = in_map[root_val]
32+
nums_left = in_root_index - in_start
33+
34+
# Recursively build left and right subtrees
35+
root.left = build_tree_from_pre(
36+
preorder, pre_start + 1, pre_start + nums_left,
37+
inorder_seq, in_start, in_root_index - 1, in_map)
38+
39+
root.right = build_tree_from_pre(
40+
preorder, pre_start + nums_left + 1, pre_end,
41+
inorder_seq, in_root_index + 1, in_end, in_map)
42+
43+
return root
44+
45+
46+
def build_tree_pre(inorder_seq, preorder_seq):
47+
"""Wrapper function for building tree from preorder + inorder."""
48+
in_map = {val: i for i, val in enumerate(inorder_seq)}
49+
return build_tree_from_pre(
50+
preorder_seq, 0, len(preorder_seq) - 1,
51+
inorder_seq, 0, len(inorder_seq) - 1, in_map)
52+
53+
54+
# === Build tree using POSTORDER + INORDER ===
55+
def build_tree_from_post(postorder, post_start, post_end,
56+
inorder_seq, in_start, in_end, in_map):
57+
"""Recursive helper to build tree from postorder and inorder traversal."""
58+
if post_start > post_end or in_start > in_end:
59+
return None
60+
61+
# Root is the last element in current postorder segment
62+
root_val = postorder[post_end]
63+
root = Node(root_val)
64+
65+
# Find the root index in inorder traversal
66+
in_root_index = in_map[root_val]
67+
nums_left = in_root_index - in_start
68+
69+
# Recursively build left and right subtrees
70+
root.left = build_tree_from_post(
71+
postorder, post_start, post_start + nums_left - 1,
72+
inorder_seq, in_start, in_root_index - 1, in_map)
73+
74+
root.right = build_tree_from_post(
75+
postorder, post_start + nums_left, post_end - 1,
76+
inorder_seq, in_root_index + 1, in_end, in_map)
77+
78+
return root
79+
80+
81+
def build_tree_post(inorder_seq, postorder_seq):
82+
"""Wrapper function for building tree from postorder + inorder."""
83+
in_map = {val: i for i, val in enumerate(inorder_seq)}
84+
return build_tree_from_post(
85+
postorder_seq, 0, len(postorder_seq) - 1,
86+
inorder_seq, 0, len(inorder_seq) - 1, in_map)
87+
88+
89+
# === Example ===
90+
if __name__ == "__main__":
91+
inorder_seq = [1, 2, 3, 4, 5]
92+
preorder_seq = [3, 2, 1, 4, 5]
93+
postorder_seq = [1, 2, 5, 4, 3]
94+
95+
print("=== Build BST from Preorder & Inorder ===")
96+
tree_pre = build_tree_pre(inorder_seq, preorder_seq)
97+
out = []
98+
inorder(tree_pre, out)
99+
print("Inorder:", *out)
100+
101+
print("=== Build BST from Postorder & Inorder ===")
102+
tree_post = build_tree_post(inorder_seq, postorder_seq)
103+
out = []
104+
inorder(tree_post, out)
105+
print("Inorder:", *out)

0 commit comments

Comments
 (0)