-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy path106 Construct Binary Tree from Preorder and Inorder Traversal.py
60 lines (47 loc) · 1.92 KB
/
106 Construct Binary Tree from Preorder and Inorder 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
"""
Given preorder and inorder traversal of a tree, construct the binary tree.
Note:
You may assume that duplicates do not exist in the tree.
Author: Rajeev Ranjan
"""
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
class Solution:
def buildTree_MLE(self, preorder, inorder):
"""
Recursive algorithm. Pre-order, in-order, post-order traversal relationship
pre-order: [root, left_subtree, right_subtree]
in-order: [left_subtree, root, right_subtree]
recursive algorithm
:param preorder: a list of integers
:param inorder: a list of integers
:return: TreeNode, root
"""
if not preorder:
return None
root = TreeNode(preorder[0])
root_index = inorder.index(root.val)
root.left = self.buildTree(preorder[1:root_index+1], inorder[0:root_index])
root.right = self.buildTree(preorder[root_index+1:], inorder[root_index+1:])
return root
def buildTree(self, preorder, inorder):
"""
Same idea as the last one, just use integer instead of list
:type preorder: List[int]
:type inorder: List[int]
:rtype: TreeNode
"""
self.preorder = preorder
self.inorder = inorder
return self._buildTree(0, len(preorder), 0, len(inorder))
def _buildTree(self, pre_start, pre_end, in_start, in_end):
if pre_start >= pre_end:
return None
root = TreeNode(self.preorder[pre_start])
offset = self.inorder[in_start:in_end + 1].index(root.val)
root.left = self._buildTree(pre_start + 1, pre_start + offset + 1, in_start, in_start + offset)
root.right = self._buildTree(pre_start + offset + 1, pre_end, in_start + offset + 1, in_end)
return root