Binary Search Tree (BST)

Un Binary Search Tree (albero binario di ricerca, BST) è un tipo particolare di albero binario che soddisfa due condizioni:
  1. Tutti i nodi figli di sinistra hanno un valore più piccolo del nodo padre.
  1. Tutti i nodi figli di destra hanno un valore più grande del nodo padre.
Perciò, per ogni nodo, o non c’è un figlio, oppure ce n’è uno più piccolo a sinistra e uno più grande a destra.
Un Binary Search Tree con 8 nodi
Un Binary Search Tree con 8 nodi
Questa caratteristica risulta particolarmente utile quando si devono cercare elementi in un albero binario. Se cerchiamo un valore x, sapere come sono organizzati i nodi ci dice sempre da che parte muoverci per trovare quel valore. Nell’esempio qui sopra, per trovare il nodo con valore 3, inizieremmo dal nodo radice che ha valore 5: dato che 5 è maggiore di 3, ci spostiamo a sinistra. Poi incontriamo il nodo con valore 2, e poiché 2 è minore di 3, andiamo a destra. Quindi ci imbattiamo nel nodo con valore 4, e siccome 4 è maggiore di 3, ci spostiamo nuovamente a sinistra. Infine troviamo il nodo con valore 3: poiché 3 è uguale a 3, significa che l’abbiamo trovato.
# Supponiamo che i nodi inesistenti siano None anziché avere valore 0
def search(node: Node | None, x: int):
    """ Restituisce True se x è presente nell'albero e False altrimenti """
    if node is None:              # Se abbiamo raggiunto la fine dell'albero
        return False              # Non abbiamo trovato il valore x
    if x == node.value:           # Se x è uguale a node.value
        return True               # => abbiamo trovato x nell'albero

    if x < node.value:            # Se x è più piccolo => dobbiamo spostarci a sinistra
        return search(node.left)  # Proviamo a trovare x nel sottoalbero di sinistra
    return search(node.right)     # Altrimenti proviamo a trovarlo in quello di destra
Questo metodo di ricerca è molto efficiente se l’altezza dell’albero è sufficientemente piccola. A ogni passo si va o a sinistra o a destra, quindi, nel caso peggiore, il numero di operazioni sarà proporzionale all’altezza dell’albero.

Challenge: Check if the given tree is a BST

Data un albero binario, il tuo compito è verificare se si tratta di un Binary Search Tree.

Input

L’input contiene interi separati da spazi, che rappresentano i valori dei nodi dell’albero binario. L’ordine dei valori segue una visita in cui, a ogni nodo, si esplora prima il sottoalbero di sinistra e poi quello di destra. Un valore di 0 indica che il nodo non esiste. È garantito che l’albero binario fornito sia valido e che i valori siano unici.

Output

Il programma deve stampare Yes se l’albero binario è un Binary Search Tree, altrimenti No.

Examples

Input (Ingresso)
Output (Uscita)
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

Explanation

Esempio 1: Sebbene tutti i nodi figli di destra siano maggiori dei rispettivi padri, non tutti i figli di sinistra risultano più piccoli del nodo padre.
notion image
Esempio 2: È un albero binario di ricerca perché tutti i nodi figli di sinistra hanno un valore inferiore al padre, mentre tutti i nodi figli di destra hanno un valore superiore al padre.
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