-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path105.py
65 lines (44 loc) · 1.89 KB
/
105.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
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
from collections import deque
class Solution:
# time complexity : O(N^2) - going through entire list
# space complexity : O(N)
# def DFS(self, preorder, inorder):
# if not inorder:
# return None
# rootval = preorder.popleft()
# rootindex = inorder.index(rootval) # O(n)
# leftvalues = inorder[:rootindex] # O(n + k)
# rightvalues = inorder[rootindex+1:] # O(n + k)
# root = TreeNode(rootval)
# root.left = self.DFS(preorder, leftvalues)
# root.right = self.DFS(preorder, rightvalues)
# return root
# maintain a pre order index from 0 as root
# index should point to the root element always
# should maintain left and right index for inorder
# list slicing boundaries
# slice based on the index of the root element in preorder # use index map
# for left slicing (left, rootindex)
# for right slicing (rootindex+1, right)
# base condition if left > right
def DFS(self, preorder, leftIndex, rightIndex):
if leftIndex > rightIndex:
return None
rootval = preorder[self.preorderIndex]
self.preorderIndex += 1
root = TreeNode(rootval)
rootIndex = self.indexmap[rootval]
root.left = self.DFS(preorder, leftIndex, rootIndex - 1)
root.right = self.DFS(preorder, rootIndex + 1, rightIndex)
return root
def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode:
preorder = deque(preorder)
self.preorderIndex = 0
self.indexmap = {val: index for index, val in enumerate(inorder)}
return self.DFS(preorder, 0, len(inorder) - 1)