Skip to content

Commit 23cc4c3

Browse files
committed
add : solve #253 Construct Binary Tree from Preorder and Inorder Traversal with ts
1 parent 5704380 commit 23cc4c3

File tree

1 file changed

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

1 file changed

+58
-0
lines changed
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
// 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+
* ์ „์œ„ ์ˆœํšŒ(preorder)์™€ ์ค‘์œ„ ์ˆœํšŒ(inorder) ๋ฐฐ์—ด์„ ์ด์šฉํ•ด ์ด์ง„ ํŠธ๋ฆฌ๋ฅผ ์žฌ๊ตฌ์„ฑํ•˜๋Š” ํ•จ์ˆ˜.
14+
*
15+
* @param {number[]} preorder - ํŠธ๋ฆฌ์˜ ์ „์œ„ ์ˆœํšŒ ๋ฐฐ์—ด (๋ฃจํŠธ โ†’ ์™ผ์ชฝ โ†’ ์˜ค๋ฅธ์ชฝ ์ˆœ์„œ).
16+
* @param {number[]} inorder - ํŠธ๋ฆฌ์˜ ์ค‘์œ„ ์ˆœํšŒ ๋ฐฐ์—ด (์™ผ์ชฝ โ†’ ๋ฃจํŠธ โ†’ ์˜ค๋ฅธ์ชฝ ์ˆœ์„œ).
17+
* @returns {TreeNode | null} - ์žฌ๊ตฌ์„ฑ๋œ ์ด์ง„ ํŠธ๋ฆฌ์˜ ๋ฃจํŠธ ๋…ธ๋“œ, ๋งŒ์•ฝ ํŠธ๋ฆฌ๊ฐ€ ๋น„์–ด์žˆ๋‹ค๋ฉด null.
18+
*
19+
* ์‹œ๊ฐ„ ๋ณต์žก๋„: O(n)
20+
* - ๊ฐ ๋…ธ๋“œ๋ฅผ ํ•œ ๋ฒˆ์”ฉ ์ฒ˜๋ฆฌํ•จ.
21+
*
22+
* ๊ณต๊ฐ„ ๋ณต์žก๋„: O(n)
23+
* - ์žฌ๊ท€ ํ˜ธ์ถœ ์Šคํƒ๊ณผ ์ค‘์œ„ ์ˆœํšŒ ๊ฐ’-์ธ๋ฑ์Šค ํ•ด์‹œ๋งต ์ €์žฅ ๊ณต๊ฐ„ ํฌํ•จ.
24+
*/
25+
function buildTree(preorder: number[], inorder: number[]): TreeNode | null {
26+
// ์ค‘์œ„ ์ˆœํšŒ ๋ฐฐ์—ด์˜ ๊ฐ ๊ฐ’๊ณผ ํ•ด๋‹น ์ธ๋ฑ์Šค๋ฅผ ์ €์žฅ
27+
const inorderIndexMap = new Map<number, number>();
28+
inorder.forEach((value, index) => inorderIndexMap.set(value, index));
29+
30+
// ์ฒ˜๋ฆฌํ•  ๋…ธ๋“œ์˜ ์ธ๋ฑ์Šค๋ฅผ ์ถ”์ 
31+
let preorderIndex = 0;
32+
33+
// ์žฌ๊ท€์ ์œผ๋กœ ์„œ๋ธŒํŠธ๋ฆฌ๋ฅผ ์žฌ๊ตฌ์„ฑํ•˜๋Š” ํ•จ์ˆ˜
34+
const helper = (left: number, right: number): TreeNode | null => {
35+
// ํ˜„์žฌ ์„œ๋ธŒํŠธ๋ฆฌ์˜ ๋ฒ”์œ„๊ฐ€ ์œ ํšจํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ
36+
if (left > right) return null;
37+
38+
// ์ „์œ„ ์ˆœํšŒ ๋ฐฐ์—ด์—์„œ ํ˜„์žฌ ๋…ธ๋“œ ๊ฐ’์„ ๊ฐ€์ ธ์™€ ๋ฃจํŠธ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์ธ๋ฑ์Šค ์ฆ๊ฐ€
39+
const rootVal = preorder[preorderIndex++];
40+
// ์ƒˆ๋กœ์šด TreeNode ๊ฐ์ฒด ์ƒ์„ฑ
41+
const root = new TreeNode(rootVal);
42+
43+
// ํ•ด์‹œ๋งต์—์„œ ํ˜„์žฌ ๋ฃจํŠธ ๊ฐ’์˜ ์ธ๋ฑ์Šค๋ฅผ ์ฐพ์•„ ์ค‘์œ„ ์ˆœํšŒ ๋ฐฐ์—ด ๋‚ด์—์„œ์˜ ์œ„์น˜ ํ™•์ธ
44+
const rootIndex = inorderIndexMap.get(rootVal)!;
45+
46+
// ์ค‘์œ„ ์ˆœํšŒ ๋ฐฐ์—ด์—์„œ ์™ผ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ ๋ฒ”์œ„ (left ~ rootIndex - 1)๋ฅผ ์žฌ๊ท€ ํ˜ธ์ถœ๋กœ ๊ตฌ์„ฑ
47+
root.left = helper(left, rootIndex - 1);
48+
// ์ค‘์œ„ ์ˆœํšŒ ๋ฐฐ์—ด์—์„œ ์˜ค๋ฅธ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ ๋ฒ”์œ„ (rootIndex + 1 ~ right)๋ฅผ ์žฌ๊ท€ ํ˜ธ์ถœ๋กœ ๊ตฌ์„ฑ
49+
root.right = helper(rootIndex + 1, right);
50+
51+
// ํ˜„์žฌ ์„œ๋ธŒํŠธ๋ฆฌ์˜ ๋ฃจํŠธ ๋…ธ๋“œ๋ฅผ ๋ฐ˜ํ™˜
52+
return root;
53+
};
54+
55+
// ์ „์ฒด ํŠธ๋ฆฌ๋ฅผ ์žฌ๊ตฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์ค‘์œ„ ์ˆœํšŒ ๋ฐฐ์—ด์˜ ์ „์ฒด ๋ฒ”์œ„(0 ~ inorder.length - 1)๋ฅผ ํ—ฌํผ ํ•จ์ˆ˜์— ์ „๋‹ฌ
56+
return helper(0, inorder.length - 1);
57+
}
58+

0 commit comments

Comments
ย (0)