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

NeetCode 150 [Trees]medium:Validate Binary Search Tree

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

NeetCodeのSolutionを書いていく
#

Validate Binary Search Tree
#

問題
#

2分木のルートが与えられます。 2分探索木が有効ならtrueを無効ならfalseを返しましょう。 2分探索木が満たすべき特徴は以下です。

  • 左側の全てのノードは自分自身よりもノードのkeyが小さいものしか持ちません
  • 右側の全てのノードは自分自身よりもノードのkeyが大きいものしか持ちません
  • 左側も右側も2分探索木である

#

Input: root = [2,1,3] Output: true

Input: root = [1,2,3] Output: false

制約
#

  • 1 <= The number of nodes in the tree <= 1000.
  • -1000 <= Node.val <= 1000
  • 計算量:O(n)
  • メモリ:O(n)

メモ
#

深さ優先で再帰的にチェックをしていけば良い? チェックするときにチェック対象の下限と上限の値を一緒に渡してチェックするのがポイント。

import collections
from typing import Optional


# 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 isValidBST(self, root: Optional[TreeNode]) -> bool:
        if not root:
            return True

        # ここで最大、最小は無限を指定するのがポイント
        q = collections.deque([(root, float("-inf"), float("inf"))])

        while q:
            node, minv, maxv = q.popleft()
            if not (minv < node.val < maxv):
                return False
            if node.left:
                q.append((node.left, minv, node.val))
            if node.right:
                q.append((node.right, node.val, maxv))
        return True
Reply by Email

関連記事

NeetCode 150 [Trees]medium:Kth Smallest Element In a Bst
· loading · loading
NeetCode 150 [Trees]medium:Count Good Nodes In Binary Tree
· loading · loading
NeetCode 150 [Trees]medium:Binary Tree Right Side View
· loading · loading