Come conservare un albero binario di ricerca per un file

February 24

Un albero binario di ricerca è una struttura dati in cui i record di dati, chiamati \ "nodi, \" avere puntatori ad altri nodi, chiamati \ "i bambini. \" Questo dà i nodi, quando graficamente fuori, una forma simile a un albero genealogico. I nodi ricevono il loro posto nella struttura basata su se sarebbero valutare come superiore o inferiore a altri nodi. bambini lasciati sono sempre meno di loro genitore; i bambini a destra sempre di più.
Binari alberi di ricerca sono importanti in informatica, perché possono essere entrambi ordinati e cercato, in media, a O (n log n).

istruzione

1 Creare una funzione negozio che riceve il nodo principale. Ogni volta che avete a che fare con gli alberi in informatica, l'algoritmo più efficace sarà quasi sempre essere ricorsiva e memorizzare l'albero in un file non farà eccezione. Ecco uno scheletro campione della funzione di memorizzazione ricorsiva (in Java).
public void negozio (nodo n) throws IOException {
...
}

2 Scrivere dati su nodo principale su file. Questo userà \ "attraversamento \ pre-order" (Root, Child Left, Bambino destra) per passare attraverso tutti i nodi dell'albero, perché questo metodo di attraversamento renderà più semplice per ricostruire l'albero dall'ordine dei nodi in il file. La funzione ricorsiva appare come segue:
public void negozio (nodo n) throws IOException {
scrittura (savefile, n);

}
Negozio dovrebbe chiamarsi con il Bambino di sinistra:
public void negozio (nodo n) throws IOException {
scrittura (savefile, n);
negozio (n.left);
}
Conservare dovrebbe chiamare se stesso con il figlio destro:
public void negozio (nodo n) throws IOException {
scrittura (savefile, n);
negozio (n.left);
negozio (n.right)
ANDARE
}

3 Doppio controllare che la funzione passa la lista di controllo ricorsivo. Per evitare errori di overflow dello stack, controllare sempre che una funzione ricorsiva soddisfa le seguenti condizioni:
Ha la funzione di avere uno stato di uscita? Sì, finché l'albero non è di profondità infinita, alla fine si raggiungerà un nodo che non ha né un figlio sinistro o destro e uscirà.
Può la ogni iterazione della funzione avvicinarsi allo stato di uscita? Sì, presumendo che l'albero non è circolare e nessun nodo ha una delle sue antenati come un bambino.
La funzione passa la lista di controllo.

4 Ricostruire dal file. Quando arriva il momento di caricare l'albero di nuovo dal file, sarà sufficiente inserire ogni nodo nell'albero come viene caricato dal file utilizzando l'algoritmo di inserimento standard. Questo dovrebbe iniziare alla radice e lavorare la sua strada verso il basso con il pre-ordine di attraversamento, mettendo il nuovo nodo nel primo spazio vuoto in cui essa si inserisce. Questo dovrebbe ricostruire l'albero esattamente come è stato originariamente composto in O (n log n) in media.

Consigli e avvertenze

  • Cattura StackOverflowException. Anche se la sua improbabile che verrà utilizzato tutto lo spazio di stack in una funzione ricorsiva scritto correttamente, se si lavora con Java, essere sicuri di prendere il StackOverflowException con tutte le funzioni ricorsive, in modo da poter trattare con loro in modo pulito.
  • Prendere il IOException. Se la scrittura verso il file non riesce da qualche parte lungo la strada, meglio sapere quando il file viene scritto rispetto a quando viene letto un file danneggiato.
  • Non conservare i puntatori su file. Un semplice errore sarebbe salvare direttamente le variabili figlio sinistro e destro da ogni nodo. Nella maggior parte delle lingue, questi verrebbero implementati come puntatori a indirizzi di memoria. Inutile dire che questi indirizzi di memoria cambieranno da una corsa all'altra, in modo da memorizzare in un file sarebbe inutile.