Skip to content

Commit 1fa7e4f

Browse files
committed
feat(soobing): week15 > construct-binary-tree-from-preorder-and-inorder-traversal
1 parent 84105a9 commit 1fa7e4f

File tree

1 file changed

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

1 file changed

+43
-0
lines changed
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
/**
2+
* 문제 설명
3+
* - preorder(전위순회), inorder(중위순회) 배열을 통해 이진트리를 복원한다
4+
*
5+
*
6+
* 아이디어
7+
* 1) preorder 배열의 요소는 루트 노드이다, 이를 기준으로 inorder 배열을 좌우로 나눈다.
8+
* 2) 좌우로 나눈 inorder 배열의 길이를 통해 preorder 배열의 좌우 서브트리를 구한다.
9+
* 3) 이를 재귀적으로 반복한다.
10+
*/
11+
12+
class TreeNode {
13+
val: number;
14+
left: TreeNode | null;
15+
right: TreeNode | null;
16+
constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
17+
this.val = val === undefined ? 0 : val;
18+
this.left = left === undefined ? null : left;
19+
this.right = right === undefined ? null : right;
20+
}
21+
}
22+
23+
function buildTree(preorder: number[], inorder: number[]): TreeNode | null {
24+
if (preorder.length === 0 || inorder.length === 0) return null;
25+
26+
const inorderIndexMap = new Map<number, number>();
27+
inorder.forEach((value, index) => inorderIndexMap.set(value, index));
28+
29+
let preorderIndex = 0;
30+
const helper = (left: number, right: number): TreeNode | null => {
31+
if (left > right) return null;
32+
const rootValue = preorder[preorderIndex++];
33+
const root = new TreeNode(rootValue);
34+
const index = inorderIndexMap.get(rootValue)!;
35+
36+
root.left = helper(left, index - 1);
37+
root.right = helper(index + 1, right);
38+
39+
return root;
40+
};
41+
42+
return helper(0, inorder.length - 1);
43+
}

0 commit comments

Comments
 (0)