Questo può essere risolto in un modo migliore. Inoltre, possiamo ridurre la complessità temporale a O (n) con una leggera modifica nella struttura dei dati e utilizzando un approccio iterativo. Per un'analisi dettagliata e molteplici modi di risolvere questo problema con varie strutture di dati.
Ecco un riassunto di ciò che voglio spiegare in un mio post sul blog :
Approccio ricorsivo - Diametro dell'albero
Un altro modo di affrontare questo problema è il seguente. Come accennato in precedenza, il diametro può
- giacciono completamente nel sottoalbero sinistro o
- giacciono completamente nel sottoalbero destro o
- può estendersi attraverso la radice
Ciò significa che il diametro può essere idealmente derivato da
- il diametro dell'albero sinistro o
- il diametro dell'albero giusto o
- l'altezza dell'albero secondario sinistro + l'altezza dell'albero secondario destro + 1 (1 per aggiungere il nodo radice quando il diametro si estende attraverso il nodo radice)
E sappiamo che il diametro è il percorso più lungo, quindi prendiamo il massimo di 1 e 2 nel caso in cui si trovi in uno dei lati o ne prendiamo 3 se attraversa la radice.
Approccio iterativo - Diametro dell'albero
Abbiamo un albero, abbiamo bisogno di una meta informazione con ciascuno dei nodi in modo che ogni nodo sappia quanto segue:
- L'altezza del suo bambino sinistro,
- L'altezza del figlio giusto e
- La distanza più lontana tra i suoi nodi fogliari.
Una volta che ogni nodo ha queste informazioni, abbiamo bisogno di una variabile temporanea per tenere traccia del percorso massimo. Al termine dell'algoritmo, abbiamo il valore del diametro nella variabile temp.
Ora, dobbiamo risolvere questo problema con un approccio dal basso verso l'alto, perché non abbiamo idea dei tre valori per il root. Ma conosciamo questi valori per le foglie.
Passaggi da risolvere
- Inizializza tutte le foglie con leftHeight e rightHeight come 1.
- Inizializza tutte le foglie con maxDistance come 0, facciamo un punto che se uno dei leftHeight o rightHeight è 1 facciamo il maxDistance = 0
- Spostati verso l'alto uno alla volta e calcola i valori per il genitore immediato. Sarebbe facile perché ora conosciamo questi valori per i bambini.
In un dato nodo,
- assegnare leftHeight come massimo di (leftHeight o rightHeight del figlio sinistro).
- assegnare rightHeight come massimo di (leftHeight o rightHeight del figlio destro).
- se uno di questi valori (leftHeight o rightHeight) è 1, imposta maxDistance come zero.
- se entrambi i valori sono maggiori di zero, impostare maxDistance come leftHeight + rightHeight - 1
- Mantenere maxDistance in una variabile temporanea e se nel passaggio 4 maxDistance è superiore al valore corrente della variabile, sostituirlo con il nuovo valore maxDistance.
- Alla fine dell'algoritmo il valore in maxDistance è il diametro.