File tree Expand file tree Collapse file tree 1 file changed +48
-0
lines changed
construct-binary-tree-from-preorder-and-inorder-traversal Expand file tree Collapse file tree 1 file changed +48
-0
lines changed Original file line number Diff line number Diff line change 1+ """
2+ LeetCode 105. Construct Binary Tree from Preorder and Inorder Traversal
3+ https://leetcode.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/
4+
5+ summary:
6+ 전위순회(preorder)와 중위순회(inorder)를 기반으로 이진트리 구성하기
7+ """
8+ # Definition for a binary tree node.
9+ # class TreeNode:
10+ # def __init__(self, val=0, left=None, right=None):
11+ # self.val = val
12+ # self.left = left
13+ # self.right = right
14+ class Solution :
15+ def buildTree (self , preorder : List [int ], inorder : List [int ]) -> Optional [TreeNode ]:
16+
17+ # DFS
18+ # 시간복잡도 O(n), 공간복잡도 최악O(n)/평균O(log n) (n = 노드수)
19+ self .preorder_idx = 0 # preorder에 현재 위치 인덱스(처음값 = 루트노드값)
20+
21+ inorder_map = {} # inorder 값을 인덱스로 매핑(빠른 검색을 위해)
22+ for i in range (len (inorder )):
23+ inorder_map [inorder [i ]] = i
24+
25+
26+ def dfs (left : int , right :int ) -> Optional [TreeNode ]:
27+ # 왼쪽인덱스가 오른쪽인덱스보다 크면(범위를벗어나면) 빈 서브트리 -> 종료
28+ if left > right :
29+ return None
30+
31+ # 현재 preorder에서 현재 루트 값 가져오고 한 칸 이동
32+ root_val = preorder [self .preorder_idx ]
33+ self .preorder_idx += 1
34+
35+ # 루트 노드 생성
36+ root = TreeNode (root_val )
37+
38+ # inorder에서 현재 루트 위치 찾기
39+ i = inorder_map [root_val ]
40+
41+ # 왼쪽, 오른쪽 서브트리 구성
42+ root .left = dfs (left , i - 1 )
43+ root .right = dfs (i + 1 , right )
44+
45+ return root
46+
47+ # 전체 inorder dfs 돌기
48+ return dfs (0 ,len (inorder )- 1 )
You can’t perform that action at this time.
0 commit comments