Skip to content

Commit 4a59c36

Browse files
committed
add solution : 105. Construct Binary Tree from Preorder and Inorder Traversal
1 parent 0e886e0 commit 4a59c36

File tree

1 file changed

+68
-0
lines changed
  • construct-binary-tree-from-preorder-and-inorder-traversal

1 file changed

+68
-0
lines changed
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
export class TreeNode {
2+
val: number;
3+
left: TreeNode | null;
4+
right: TreeNode | null;
5+
constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
6+
this.val = val === undefined ? 0 : val;
7+
this.left = left === undefined ? null : left;
8+
this.right = right === undefined ? null : right;
9+
}
10+
}
11+
12+
/**
13+
*
14+
* 접근 방법
15+
* - preorder는 root -> left -> right 순서로 진행되니까 첫 번째 요소가 root노드 값인 점을 이용
16+
* - preorder에서 root 노드 값 파악
17+
* - inorder(left -> root -> right)에서 head 노드 기준으로 왼쪽 서브 트리, 오른쪽 하위 서브 나누기
18+
* - inorder의 왼쪽 트리 노드 개수 활용해서 preorder도 왼쪽, 오른쪽 나누기
19+
* - 재귀 함수를 통해서 위 과정 반복하기
20+
* - 재귀 함수 기저 조건으로 빈 배열이 들어오는 경우 null처리
21+
*
22+
* 시간복잡도 : O(n)
23+
* - forEach문으로 map에 값 초기화하니까 O(n)
24+
* - dfs가 각 노드 방문해서 노드 개수 n만큼 호출하니까 O(n)
25+
*
26+
* 공간복잡도 : O(n)
27+
* - indexMap - n이 노드의 개수일 때 map에 노드의 인덱스 모두 저장하니까 O(n)
28+
* - 최악의 경우 한쪽으로 치우친 트리의 경우 재귀 호출 O(n)
29+
*
30+
*/
31+
function buildTree(preorder: number[], inorder: number[]): TreeNode | null {
32+
// index 미리 map에 저장해두기
33+
const indexMap = new Map<number, number>();
34+
inorder.forEach((number, index) => indexMap.set(number, index));
35+
36+
// preorder index, inorder range를 전달하기
37+
const dfs = (
38+
preorderIndex: number,
39+
inorderStartIndex: number,
40+
inorderEndIndex: number
41+
): TreeNode | null => {
42+
// 기저 조건
43+
if (
44+
!(preorderIndex < preorder.length && inorderStartIndex <= inorderEndIndex)
45+
)
46+
return null;
47+
48+
const rootValue = preorder[preorderIndex];
49+
const inorderRootIndex = indexMap.get(rootValue) as number;
50+
51+
// 왼쪽 하위 트리 범위 = inorder 배열의 start부터 root인덱스 이전까지
52+
const left = dfs(
53+
preorderIndex + 1,
54+
inorderStartIndex,
55+
inorderRootIndex - 1
56+
);
57+
// 오른쪽 하위 트리 범위 = root인덱스 다음부터 끝까지
58+
const right = dfs(
59+
preorderIndex + 1 + (inorderRootIndex - inorderStartIndex),
60+
inorderRootIndex + 1,
61+
inorderEndIndex
62+
);
63+
64+
return new TreeNode(rootValue, left, right);
65+
};
66+
67+
return dfs(0, 0, inorder.length - 1);
68+
}

0 commit comments

Comments
 (0)