Binärer Suchbaum (BST)

Ein Binary Search Tree (BST) ist eine spezielle Art von binärem Baum, der zwei Eigenschaften aufweist:
  1. Alle linken Kindknoten haben einen kleineren Wert als ihr Elternknoten.
  1. Alle rechten Kindknoten haben einen größeren Wert als ihr Elternknoten.
Für jeden Knoten gilt also, dass entweder ein Kindknoten fehlt oder der linke Kindknoten einen kleineren Wert hat und der rechte Kindknoten einen größeren Wert – immer in Bezug auf den Elternknoten.
Ein Binary Search Tree mit 8 Knoten
Ein Binary Search Tree mit 8 Knoten
Diese Eigenschaft ist besonders nützlich, um Elemente in einem binären Baum zu suchen. Wenn wir nach einem Wert x suchen, wissen wir dadurch immer, in welche Richtung wir gehen müssen, um diesen Wert zu finden. Im obigen Beispiel suchen wir beispielsweise den Knoten mit dem Wert 3. Zuerst schauen wir uns den Wurzelknoten mit dem Wert 5 an. Da 5 größer als 3 ist, gehen wir nach links. Anschließend betrachten wir den Knoten mit dem Wert 2. Da 2 kleiner als 3 ist, bewegen wir uns nach rechts weiter. Jetzt sehen wir den Knoten mit dem Wert 4. Dieser Wert ist größer als 3, also gehen wir nach links. Schließlich treffen wir auf den Knoten mit dem Wert 3. Da 3 dem gesuchten Wert 3 entspricht, haben wir den Knoten gefunden.
# Angenommen, dass nicht existierende Knoten None sind, anstatt den Wert 0 zu besitzen
def search(node: Node | None, x: int):
    """Gibt True zurück, falls x im Baum vorhanden ist, ansonsten False."""
    if node is None:              # Wenn wir das Ende des Baums erreicht haben
        return False              # wurde der Wert x nicht gefunden
    if x == node.value:           # Wenn x dem Wert des aktuellen Knotens entspricht
        return True               # => wir haben den Wert x im Baum gefunden

    if x < node.value:            # Ist x kleiner => wir müssen nach links gehen
        return search(node.left)  # Versuch, x im linken Teilbaum zu finden
    return search(node.right)     # Andernfalls versuchen wir es im rechten Teilbaum
Diese Suchmethode kann sehr effizient sein, wenn die Höhe des Baums gering genug ist. In jeder Iteration bewegen wir uns entweder zum linken oder zum rechten Teilbaum. Die Anzahl der benötigten Operationen ist somit im schlimmsten Fall gleich der Höhe des Baums.

Herausforderung: Prüfe, ob der gegebene Baum ein BST ist

Gegeben ist ein binärer Baum. Deine Aufgabe ist es zu überprüfen, ob er ein Binary Search Tree (BST) ist.

Eingabe

Die Eingabe enthält durch Leerzeichen getrennte Ganzzahlen, die die Werte der Knoten im binären Baum repräsentieren. Die Reihenfolge der Werte wird stets angegeben, indem zuerst der linke, dann der rechte Teilbaum durchlaufen wird. Ein Wert von 0 bedeutet, dass der Knoten nicht existiert. Es wird garantiert, dass das eingegebene binäre Baum-Format gültig ist und die Werte eindeutig sind.

Ausgabe

Das Programm soll “Yes” ausgeben, wenn der binäre Baum ein Binary Search Tree ist, andernfalls “No”.

Beispiele

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

Erklärung

Beispiel 1: Obwohl alle rechten Kindknoten größere Werte haben als ihre Eltern, sind nicht alle linken Kindknoten kleiner als ihre Eltern.
notion image
Beispiel 2: Hier handelt es sich um einen Binary Search Tree, weil alle linken Kindknoten kleinere Werte als ihr Elternknoten besitzen und alle rechten Kindknoten einen größeren Wert als ihr Elternknoten aufweisen.
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