|
| 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