Skip to content

Commit 1f174be

Browse files
committed
construct-binary-tree-from-preorder-and-inorder-traversal solution
1 parent 4dd47c6 commit 1f174be

File tree

1 file changed

+48
-0
lines changed

1 file changed

+48
-0
lines changed
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
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)

0 commit comments

Comments
 (0)