|
| 1 | +"""TC: O(n), SC: O(n) |
| 2 | +
|
| 3 | +์์ด๋์ด: |
| 4 | +- preorder ํธ๋ฆฌ๊ฐ ์ฃผ์ด์ ธ ์๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๋ถํ ํ ์ ์๋ค. |
| 5 | + - [root๊ฐ, [...left], [...right]] |
| 6 | + - ์์ left, right๋ preorder ํธ๋ฆฌ์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ๊ตฌ์ฑ๋๋ค. |
| 7 | +- inorder ํธ๋ฆฌ๊ฐ ์ฃผ์ด์ ธ ์๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๋ถํ ํ ์ ์๋ค. |
| 8 | + - [[...left], root๊ฐ, [...right]] |
| 9 | + - ์์ left, right๋ inorder ํธ๋ฆฌ์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ๊ตฌ์ฑ๋๋ค. |
| 10 | + - ์ด๋, |
| 11 | + - left์ ์ฒซ ์์ดํ
์ด ์ธ๋ฑ์ค inorder_s์ ์๊ณ , |
| 12 | + - right์ ๋ง์ง๋ง ์์ดํ
์ด ์ธ๋ฑ์ค inorder_e - 1์ ์๋ค๊ณ ํ์. |
| 13 | + - ์ฆ, inorder_e๋ฅผ ๋ฏธํฌํจ! |
| 14 | +- preorder ํธ๋ฆฌ์ ๋งจ ์ ๊ฐ์ ํตํด root๊ฐ val์ ์ฐพ๊ณ , ์ด ๊ฐ์ผ๋ก inorder์ root๊ฐ์ ์ธ๋ฑ์ค๋ฅผ ์ฐพ์ ์ ์๋ค. |
| 15 | + - ๋ชจ๋ node์ val๊ฐ์ด uniqueํ ๊ฒ์ด ์กฐ๊ฑด์ผ๋ก ์ฃผ์ด์ ธ ์์ผ๋ฏ๋ก val๊ฐ์ indices๋ฅผ ์ ์ฒ๋ฆฌํด๋ ์ ์๋ค. |
| 16 | + - ์ด๋, inorder์ root๊ฐ์ ์ธ๋ฑ์ค๋ฅผ inorder_root์ด๋ผ๊ณ ํ์. |
| 17 | +- inorder์ root๊ฐ์ ์์น์ inorder ํธ๋ฆฌ์ ์์ ์์น๋ฅผ ์ ์ ์๋ค๋ฉด |
| 18 | + [...left]์ ๊ธธ์ด left_len์ ์ ์ ์๋ค. |
| 19 | + - left_len = inorder_root - inorder_start |
| 20 | +- preorder ํธ๋ฆฌ์ left์ ๋ฃจํธ๋ [...left]์ ์ฒซ ์์ดํ
, ์ฆ, preorder_root์ 1์ ๋ํ ๊ฐ์ด๋ค. |
| 21 | +- preorder ํธ๋ฆฌ์ right์ ๋ฃจํธ๋ [...right]์ ์ฒซ ์์ดํ
, ์ฆ, preorder_root + 1 + left_len์ด๋ค. |
| 22 | +- root๊ฐ์ ๊ตฌํ ์ ์์ผ๋ฉด ๋
ธ๋๊ฐ ์๋ค. |
| 23 | + - inorder_s >= inorder_e์ ๊ฐ์ด ํ๋ณ์ด ๊ฐ๋ฅํ๋ค. ์ฆ, ์์ดํ
์ด ํ๋๋ ์๋ ๊ฒฝ์ฐ. |
| 24 | +
|
| 25 | +์์ ์์ด๋์ด๋ฅผ ์ข
ํฉํ๋ฉด, |
| 26 | +- preorder ํธ๋ฆฌ์ ๋ฃจํธ ์ธ๋ฑ์ค preorder_root๊ฐ ์ฃผ์ด์ง, ๊ตฌ๊ฐ (inorder_s, inorder_e)์์ ์ ์๋ inorder ํธ๋ฆฌ๋ |
| 27 | + - val๊ฐ์ preorder[preorder_root]์ด ๋๋ค. |
| 28 | + - left node๋ ์๋์ ๊ฐ์ด ๊ตฌํด์ง๋ค. |
| 29 | + - preorder ํธ๋ฆฌ์ ๋ฃจํธ ์ธ๋ฑ์ค preorder_root + 1, |
| 30 | + - ๊ตฌ๊ฐ (inorder_s, inorder_root) |
| 31 | + - ์ด๋ ๊ตฌ๊ฐ์ด ์ ํจํ์ง ์์ผ๋ฉด ๋
ธ๋๊ฐ ์๋ค. |
| 32 | + - right node๋ ์๋์ ๊ฐ์ด ๊ตฌํด์ง๋ค. |
| 33 | + - preorder ํธ๋ฆฌ์ ๋ฃจํธ ์ธ๋ฑ์ค preorder_root + 1 + left_len, |
| 34 | + - ๊ตฌ๊ฐ (inorder_root + 1, inorder_end) |
| 35 | + - ์ด๋ ๊ตฌ๊ฐ์ด ์ ํจํ์ง ์์ผ๋ฉด ๋
ธ๋๊ฐ ์๋ค. |
| 36 | +
|
| 37 | +
|
| 38 | +SC: |
| 39 | +- ์ฒ์ inorder_indices๋ฅผ ๊ณ์ฐํ ๋ O(n). |
| 40 | +- ์๋์ buildํจ์ ํธ์ถ์ด ์ต๋ ํธ๋ฆฌ์ ๊น์ด๋งํผ ์ฌ๊ท๋ฅผ ๋๋ฉด์ ์์ผ ์ ์๋ค. |
| 41 | + - ํธ๋ฆฌ์ ๊น์ด๋ ์ต์
์ ๊ฒฝ์ฐ O(n). |
| 42 | + |
| 43 | +TC: |
| 44 | +- buildํจ์๋ O(1). ์ฝ๋ ์ฐธ์กฐ. |
| 45 | +- ์์ ๊ณผ์ ์ n๊ฐ์ ๋
ธ๋์ ๋ํด ๋ฐ๋ณตํ๋ฏ๋ก O(n). |
| 46 | +""" |
| 47 | + |
| 48 | + |
| 49 | +# Definition for a binary tree node. |
| 50 | +# class TreeNode: |
| 51 | +# def __init__(self, val=0, left=None, right=None): |
| 52 | +# self.val = val |
| 53 | +# self.left = left |
| 54 | +# self.right = right |
| 55 | +class Solution: |
| 56 | + def buildTree(self, preorder: List[int], inorder: List[int]) -> Optional[TreeNode]: |
| 57 | + inorder_indices = {v: i for i, v in enumerate(inorder)} |
| 58 | + |
| 59 | + def build(inorder_s, inorder_e, preorder_root): |
| 60 | + if inorder_s >= inorder_e: # O(1) |
| 61 | + return None |
| 62 | + val = preorder[preorder_root] # O(1) |
| 63 | + inorder_root = inorder_indices[val] # O(1) |
| 64 | + left_len = inorder_root - inorder_s # O(1) |
| 65 | + return TreeNode( |
| 66 | + val, |
| 67 | + left=build(inorder_s, inorder_root, preorder_root + 1), |
| 68 | + right=build(inorder_root + 1, inorder_e, preorder_root + 1 + left_len), |
| 69 | + ) |
| 70 | + |
| 71 | + return build(0, len(inorder), 0) |
| 72 | + |
| 73 | + |
| 74 | +""" |
| 75 | +๊ทธ๋ฐ๋ฐ ์์ ์์ด๋์ด๋ฅผ ๋ค์ ์๊ฐํด๋ณด๋ฉด, ๋ชจ๋ ๋
ธ๋๋ค์ preorder ์์๋ก ์ํํ๋ค! |
| 76 | +- `val = preorder[preorder_root]`์ ๊ฐ์ ๋ฐฉ์์ผ๋ก val๊ฐ์ ๊ตฌํ์ง ์๊ณ , ์ฃผ์ด์ง preorder๋ฅผ ์์๋๋ก ๊ฐ์ ธ์๋ ๋จ. |
| 77 | +- ์ฆ, preorder๋ฅผ iterator๋ก ๋ฐ๊ฟ์ next๋ฅผ ํตํด ๊ฐ์ ํ๋์ฉ ๋ฝ์์์ ๊ฑด๋ค์ค๋ ๋๋ค. |
| 78 | +- ์ด๋ ๊ฒ ํ๋ฉด buildํจ์์ preorder_root๋ฅผ ์ ๋ฌํ์ง ์์๋ ๋จ. |
| 79 | +""" |
| 80 | + |
| 81 | + |
| 82 | +class Solution: |
| 83 | + def buildTree(self, preorder: List[int], inorder: List[int]) -> Optional[TreeNode]: |
| 84 | + inorder_indices = {v: i for i, v in enumerate(inorder)} |
| 85 | + preorder_iter = iter(preorder) |
| 86 | + |
| 87 | + def build(inorder_s, inorder_e): |
| 88 | + if inorder_s >= inorder_e: # O(1) |
| 89 | + return None |
| 90 | + val = next(preorder_iter) # O(1) |
| 91 | + inorder_root = inorder_indices[val] # O(1) |
| 92 | + return TreeNode( |
| 93 | + val, |
| 94 | + left=build(inorder_s, inorder_root), |
| 95 | + right=build(inorder_root + 1, inorder_e), |
| 96 | + ) |
| 97 | + |
| 98 | + return build(0, len(inorder)) |
0 commit comments