🐙

NeetCode 150 [Tree]medium:Lowest Common Ancestor in Binary Search Tree

に公開

NeetCodeのSolutionを書いていく

Lowest Common Ancestor in Binary Search Tree

問題

すべてのノードの値がユニークである2分木が与えられます。
ノードp,qの値が与え荒れたときに、共通となる祖先の最小値を返します。

制約

  • ノード数は2以上100以下
  • ノードの値は-100以上100以下
  • pとqは必ず異なり、ツリーに存在する

計算量:O(h) hはツリーの高さ
メモリ:O(h)

Input: root = [5,3,8,1,4,7,9,null,2], p = 3, q = 8
Output: 5

Input: root = [5,3,8,1,4,7,9,null,2], p = 3, q = 4
Output: 3

メモ

Binary Search Treeとは
左側の子孫の値 <= 自らの値 <= 右側の子孫の値
になるように作られた構造とのこと。多分昔勉強したはずだけど完全に忘れている。
この特性を使って解く模様。

ヒントを読んでも意味がわからず、Solutionを見てようやく理解できた。

  • ルートから探索を始めて、p,qの数字が自分と同じであれば自分自身が答えとなる
  • p,qの探索が左右に別れたら自分自身が答えとなる
  • それ以外であれば左なら左、右なら右をルートとして再帰的に検索を繰り返す
    """
# Definition for a binary tree node.
class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right


class Solution:
    def lowestCommonAncestor(self, root: TreeNode, p: TreeNode, q: TreeNode) -> TreeNode:
        # ルートから探索を始めて、p,qの数字が自分と同じであれば自分自身が答えとなる
        # p,qの探索が左右に別れたら自分自身が答えとなる
        # それ以外であれば左なら左、右なら右をルートとして再帰的に検索を繰り返す
        if root.val == p.val or root.val == q.val:
            return root

        if (p.val < root.val < q.val) or (q.val < root.val < p.val):
            return root

        if p.val < root.val and q.val < root.val:
            return self.lowestCommonAncestor(root.left, p, q)

        return self.lowestCommonAncestor(root.right, p, q)

Discussion