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+ '''
731class Solution :
832 '''
933 A. 재귀 풀이
@@ -33,10 +57,10 @@ def setTree(pre_left, pre_right, in_left, in_right):
3357
3458 return mid # 현재 노드 반환
3559
36- # inorder를 값 -> 인덱스 맵핑한 딕셔너리 생성 ( O(n))
60+ # inorder를 값 -> 인덱스 맵핑한 딕셔너리 생성 - TC: O(n), SC: O(n )
3761 inorder_idx_map = {value : idx for idx , value in enumerate (inorder )}
3862
39- # 트리 생성 시작 (preorder와 inorder 전체 범위 사용)
63+ # 트리 생성 시작 (preorder와 inorder 전체 범위 사용) - TC: O(n), SC: O(n)
4064 return setTree (0 , len (preorder ) - 1 , 0 , len (inorder ) - 1 )
4165
4266
@@ -54,7 +78,7 @@ def setTree(pre, start, end):
5478 return None
5579
5680 val = preorder [pre ] # 현재 노드의 값
57- root = inorder .index (val ) # 트리/서브트리의 루트 노드 인덱스 찾기 - SC : O(n)
81+ root = inorder .index (val ) # 트리/서브트리의 루트 노드 인덱스 찾기 - TC : O(n)
5882
5983 left = setTree (pre + 1 , start , root - 1 )
6084 # inorder에서 root노드의 왼쪽은 왼쪽 서브트리
@@ -67,7 +91,7 @@ def setTree(pre, start, end):
6791 return TreeNode (preorder [pre ], left , right ) # 트리 노드 생성
6892
6993 # 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)
7195
7296 '''
7397 C. 재귀 풀이 + 시간 최적화
0 commit comments