二分探索木 (Binary Search Tree, BST)

二分探索木 (Binary Search Tree, BST) は、次の2つの性質を備えた特別な種類の二分木です:
  1. 左の子ノードはすべて、親ノードよりも小さい値を持つ
  1. 右の子ノードはすべて、親ノードよりも大きい値を持つ
つまり、各ノードは子ノードがないか、左側には親より小さい値を、右側には親より大きい値をもつ子ノードを持つことになります。
8つのノードを持つ二分探索木の例
8つのノードを持つ二分探索木の例
この性質は、二分木の中で要素を探索するときに特に役立ちます。もし値 x を探しているとすると、常にどちらの方向に進めばよいかが分かるからです。上の例で値 3 を探すときは、まずルートノードの値が5であることを確認します。5は3より大きいため左側に進みます。次に値が2のノードを確認し、2は3より小さいため右側に進みます。続いて値が4のノードを確認し、4は3より大きいため左側に進みます。最後に値が3のノードを見つけ、探していた値3に等しいことから、そのノードを見つけたことがわかります。
# ノードが存在しない場合はNoneとし、値0は使用しない
def search(node: Node | None, x: int):
    """ x が木の中にあれば True を、なければ False を返す """
    if node is None:              # 木の末端まで到達
        return False              # x を見つけられなかった
    if x == node.value:           # x と node.value が等しい場合
        return True               # => 木の中で x を見つけたことになる

    if x < node.value:            # x がノードの値より小さい => 左側へ進む
        return search(node.left)  # 左部分木で x を探す
    return search(node.right)     # それ以外の場合は右部分木を探す
このような探索方法は、木の高さが比較的低い場合に非常に効率的です。各ステップで左か右の部分木に進むだけなので、最悪の場合でも探索に必要な操作回数は木の高さに相当します。

課題: 与えられた木がBSTかどうかをチェックする

二分木が与えられたときに、それが二分探索木 (BST) であるかどうかを判定してください。

入力

入力は、ノードの値を空白区切りで与えます。値は「左の部分木から右の部分木へ」という順序で並んでいます。ノードが存在しない場合は0で表されています。入力される二分木は必ず有効で、値はすべてユニーク(重複なし)です。

出力

もし与えられた二分木が二分探索木なら Yes、そうでなければ No を出力してください。

Input
Output
1 2 3 8 5 0 0 0 0 5 8 0 0 0 0
No
5 2 7 1 4 0 0 3 0 0 0 6 8 0 0 0 0
Yes

解説

例1: 右側の子ノードがすべて親ノードより大きい値を持っているにもかかわらず、左側の子ノードが常に親より小さいとは限りません。
notion image
例2: 左側の子ノードは常に親より値が小さく、右側の子ノードは常に値が大きいため、二分探索木の性質を満たしています。
notion image
 
 

Constraints

Time limit: 2 seconds

Memory limit: 512 MB

Output limit: 1 MB

To check your solution you need to sign in
Sign in to continue