mmm... effettivamente non avevo dato sguardo a questa cosa.
Dal grafico possiamo capire che l'albero e' non ordinato poiche' un discendente del figlio sinistro e' piu' grande del nodo in considerazione (80 > 40).
Mentre dall'altra parte abbiamo che un discendente del figlio destro e' piu' piccolo del nodo in considerazione (30 < 50).
Allora esistono degli algoritmi chiamati inOrder Traversal, che in particolare ti fanno attraversare tutto l'albero per cercare gli elementi in ordine:
http://en.wikibooks.org/wiki/A-level_Co ... inary_tree
una soluzione efficiente che ho trovato a questo url:
http://www.geeksforgeeks.org/a-program- ... st-or-not/ (soluzione 3)
che ti evita di fare avanti ed indietro e quella di utilizzare due variabili MIN e MAX. Faccio un esempio utilizzando un pivout che chiamo MIN e MAX sostituito al valore dell'elemento root.
facciamo le cose Step By Step:
Siamo al nodo root, quindi MIN:50, MAX:50 andiamo in order, per ogni elemento ovviamente controllo se si trova a sinistra che sia piu' piccolo del padre, se si trova a destra che sia piu' grande del padre.
Codice: Seleziona tutto
andando a sinistra di 50 siamo sul nodo 40. 40 > MAX? no OK! (MAX: 50)
andiamo a sinistra di 40 siamo sul nodo 20. 20 > MAX? no OK! (MAX: 50)
andiamo a sinistra di 20 siamo sul nodo 10. 10 > MAX? no Ok! (MAX: 50)
10 non ha figli. saliamo su nodo 20
andiamo a destra di 20 siamo sul nodo 80. 80 > MAX? si -> salvare nodo 80 come primo match.
80 non ha figli saliamo sul nodo 20
saliamo sul nodo 40
andiamo a destra del nodo 40 siamo sul nodo 45. 45 > MAX? no OK! (MAX: 50)
45 non ha figli saliamo sul nodo 40
saliamo sul nodo 50.
Stessa cosa per gli elementi a destra della radice.
Il metodo 4 suggerito nel link di sopra, riporta una soluzione di spostare gli elementi in un array usando il metodo In-Order Traversal, dopo di che controllare se l'array e' ordinato. Se non e' ordinato cercare di prendere gli elementi fuori posto.
In questo caso avremmo un array del tipo
ovviamente gli elementi fuori posto sono 80 e 30.
Pero' in questo caso la durata e'
O(n) + P(n) + scambio(1)
O(n) = inOrder Traversal
P(n) = isInOrder Array