|
| 1 | +# μ£Όμ΄μ§ BSTμ λ
Έλ p, qκ° μ£Όμ΄μ§ λ |
| 2 | +# μ΄ λμ κ°μ₯ κ°κΉμ΄ κ³΅ν΅ μ‘°μ(Lowest Common Ancestor, LCA)μ μ°Ύμ λ°νν΄λΌ |
| 3 | +# κ³΅ν΅ μ‘°μμ΄λ, pμ q λͺ¨λμ μ‘°μ μ€μμ κ°μ₯ κΉμ λ
Έλλ₯Ό μλ―Έ |
| 4 | +# |
| 5 | +# BST(Binary Search Tree)μ νΉμ§ |
| 6 | +# - κ° λ
Έλλ μ΅λ λ κ°μ μμ λ
Έλλ₯Ό κ°μ§ μ μμ |
| 7 | +# - μΌμͺ½ μλΈνΈλ¦¬μ λͺ¨λ κ°μ νμ¬ λ
Έλλ³΄λ€ μκ³ , |
| 8 | +# - μ€λ₯Έμͺ½ μλΈνΈλ¦¬μ λͺ¨λ κ°μ νμ¬ λ
Έλλ³΄λ€ νΌ. |
| 9 | +# |
| 10 | +# νμ΄ |
| 11 | +# νμ¬ λ
Έλκ° p, qλ³΄λ€ λ λ€ μμΌλ©΄, μ€λ₯Έμͺ½ μλΈνΈλ¦¬μμ LCAλ₯Ό μ°Ύκ³ , |
| 12 | +# λ λ€ ν¬λ©΄, μΌμͺ½ μλΈ νΈλ¦¬μμ μ°Ύκ³ , |
| 13 | +# νμͺ½μ μκ³ , νμͺ½μ ν¬λ©΄ νμ¬ λ
Έλκ° LCAκ° λ¨. |
| 14 | + |
| 15 | +# TC: O(H), Hλ μ΄μ§ κ²μ νΈλ¦¬μ λμ΄ |
| 16 | +# SC: O(H), μ¬κ· μ€νμ νμν κ³΅κ° |
| 17 | + |
| 18 | +# Definition for a binary tree node. |
| 19 | +class TreeNode: |
| 20 | + def __init__(self, x): |
| 21 | + self.val = x |
| 22 | + self.left = None |
| 23 | + self.right = None |
| 24 | + |
| 25 | +# μ¬κ· νμ΄ |
| 26 | +# TC: O(H), Hλ μ΄μ§ κ²μ νΈλ¦¬μ λμ΄ |
| 27 | +# SC: O(H), μ¬κ· μ€νμ νμν κ³΅κ° |
| 28 | +class Solution: |
| 29 | + def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode': |
| 30 | + if p.val < root.val and q.val < root.val: |
| 31 | + return self.lowestCommonAncestor(root.left, p, q) |
| 32 | + if root.val < p.val and root.val < q.val: |
| 33 | + return self.lowestCommonAncestor(root.right, p, q) |
| 34 | + return root |
| 35 | + |
| 36 | +# λ°λ³΅ νμ΄ |
| 37 | +# TC: O(H), Hλ μ΄μ§ κ²μ νΈλ¦¬μ λμ΄ |
| 38 | +# SC: O(1) |
| 39 | +class Solution: |
| 40 | + def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode': |
| 41 | + node = root |
| 42 | + while node: |
| 43 | + if p.val < node.val and q.val < node.val: |
| 44 | + node = node.left |
| 45 | + elif node.val < p.val and node.val < q.val: |
| 46 | + node = node.right |
| 47 | + else: |
| 48 | + return node |
0 commit comments