1
- # Definition for a binary tree node.
2
- # class TreeNode:
3
- # def __init__(self, val=0, left=None, right=None):
4
- # self.val = val
5
- # self.left = left
6
- # self.right = right
1
+
2
+ '''
3
+ # Leetcode 105. Construct Binary Tree from Preorder and Inorder Traversal
4
+
5
+ use **recursive** to solve this problem.
6
+
7
+ ## Time and Space Complexity
8
+
9
+ ### A. recursive & change range of preorder and inorder
10
+
11
+ ```
12
+ TC: O(n)
13
+ SC: O(n)
14
+ ```
15
+
16
+ ### B. recursive & search index (of inorder)
17
+
18
+ ```
19
+ TC: O(n^2)
20
+ SC: O(n)
21
+ ```
22
+
23
+ ### C. recursive & hash table
24
+
25
+ ```
26
+ TC: O(n)
27
+ SC: O(n)
28
+ ```
29
+
30
+ '''
7
31
class Solution :
8
32
'''
9
33
A. 재귀 풀이
@@ -33,10 +57,10 @@ def setTree(pre_left, pre_right, in_left, in_right):
33
57
34
58
return mid # 현재 노드 반환
35
59
36
- # inorder를 값 -> 인덱스 맵핑한 딕셔너리 생성 ( O(n))
60
+ # inorder를 값 -> 인덱스 맵핑한 딕셔너리 생성 - TC: O(n), SC: O(n )
37
61
inorder_idx_map = {value : idx for idx , value in enumerate (inorder )}
38
62
39
- # 트리 생성 시작 (preorder와 inorder 전체 범위 사용)
63
+ # 트리 생성 시작 (preorder와 inorder 전체 범위 사용) - TC: O(n), SC: O(n)
40
64
return setTree (0 , len (preorder ) - 1 , 0 , len (inorder ) - 1 )
41
65
42
66
@@ -54,7 +78,7 @@ def setTree(pre, start, end):
54
78
return None
55
79
56
80
val = preorder [pre ] # 현재 노드의 값
57
- root = inorder .index (val ) # 트리/서브트리의 루트 노드 인덱스 찾기 - SC : O(n)
81
+ root = inorder .index (val ) # 트리/서브트리의 루트 노드 인덱스 찾기 - TC : O(n)
58
82
59
83
left = setTree (pre + 1 , start , root - 1 )
60
84
# inorder에서 root노드의 왼쪽은 왼쪽 서브트리
@@ -67,7 +91,7 @@ def setTree(pre, start, end):
67
91
return TreeNode (preorder [pre ], left , right ) # 트리 노드 생성
68
92
69
93
# preorder 최초 인덱스 = 루트 노드(0), inorder의 처음(0)과 끝(len(inorder) - 1) 인덱스
70
- return setTree (0 , 0 , len (inorder ) - 1 )
94
+ return setTree (0 , 0 , len (inorder ) - 1 ) # TC: O(n^2), SC: O(n)
71
95
72
96
'''
73
97
C. 재귀 풀이 + 시간 최적화
0 commit comments