メインコンテンツへスキップ

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

· loading · loading ·
kiitosu
著者
kiitosu
画像処理やデバイスドライバ、データ基盤構築からWebバックエンドまで、多様な領域に携わってきました。地図解析や地図アプリケーションの仕組みにも経験があり、幅広い技術を活かした開発に取り組んでいます。休日は草野球とランニングを楽しんでいます。
目次

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)
Reply by Email

関連記事

NeetCode 150 [Trees]medium:Binary Tree Level Order Traversal
· loading · loading
NeetCode 150 [Linked List]medium:LRU Cache
· loading · loading
NeetCode 150 [Linked List]medium:Find the Duplicate Number
· loading · loading