Come fare postorder Traversal in un albero binario in Java

December 16

Sebbene Java non fornisce una classe albero binario nelle librerie predefinite, una classe base albero binario è abbastanza semplice da presentare. A "attraversamento" di una struttura di dati è un algoritmo che visita ogni nodo volta. Questo è spesso implementato come una sorta di iteratore (molto simile a un iteratore di lista) o il metodo che chiamerà un metodo di callback per ogni nodo. In Java, per fare un attraversamento "postorder", che si recherà in visita il nodo radice ultima, non sono necessari callback o iteratori. La funzione di attraversamento sarà sufficiente stampare ogni nodo si visita alla console.

istruzione

1 Scrivere una classe binario di base di ricerca albero. Ci sono solo due metodi che devono essere supportati in questa fase: un costruttore di base che inizializza il valore del nodo, e un metodo di inserimento. Il metodo di inserimento attraverserà un albero e creare un nuovo nodo nella posizione corretta. ""public class BinaryTree {
BinaryTree left;
BinaryTree right;
int value;

public BinaryTree(int v) {
value = v;
}

// Insert a value into the tree
public void insert(int v) {
if(v < value) {
if(left == null)
left = new BinaryTree(v);
else
left.insert(v);
}

else if(v > value) {
if(right == null)
right = new BinaryTree(v);
else
right.insert(v);
}
}""
""public class BinaryTree {
BinaryTree left;
BinaryTree right;
int value;

public BinaryTree(int v) {
value = v;
}

// Insert a value into the tree
public void insert(int v) {
if(v < value) {
if(left == null)
left = new BinaryTree(v);
else
left.insert(v);
}

else if(v > value) {
if(right == null)
right = new BinaryTree(v);
else
right.insert(v);
}
}""

2 Creare un'istanza del albero binario che sarà il nodo principale. Ogni nodo, anche il nodo radice, deve avere un valore.

3 Scegliere un valore per il nodo radice che è da qualche parte nel mezzo degli oggetti sarai l'archiviazione. Ad esempio, se si sta memorizzare una distribuzione uniforme dei numeri da 1 a 100, 50 è una buona scelta per il nodo principale. Alberi binari devono essere il più equilibrato possibile, dal momento che gli alberi sbilanciati crescono molto alto e non sono molto efficaci. ""BinaryTree b = new BinaryTree(50);""

4 Inserire alcuni nodi nell'albero. Dal momento che questo albero non è auto-bilanciamento, per mantenere l'equilibrio, i nodi devono essere inseriti in un ordine specifico. L'ordine in questo codice di esempio, è realizzato per rendere l'albero più breve e più efficiente possibile. ""b.insert(20);
b.insert(40);
b.insert(10);
b.insert(5);
b.insert(45);

b.insert(70);
b.insert(60);
b.insert(80);
b.insert(55);
b.insert(85);""
""b.insert(20);
b.insert(40);
b.insert(10);
b.insert(5);
b.insert(45);

b.insert(70);
b.insert(60);
b.insert(80);
b.insert(55);
b.insert(85);""

5 Traverse l'albero, attraversare l'albero di sinistra prima, seguita da l'albero giusto, e poi finalmente il nodo principale. Se la ricorsione è usato per fare il attraversamento postorder, il metodo è lunga solo tre righe. In questo caso, lo stack crescerà soltanto fino all'altezza dell'albero. Dal momento che l'albero è bilanciato e piccoli, la ricorsione non traboccherà lo stack.

6 Aggiungere un nuovo metodo alla classe BinaryTree chiamato postorder. Qui, viene stampato solo il valore di ogni nodo si visita. ""public void postorder() {
if(left != null) left.postorder();
if(right != null) right.postorder();
System.out.println(value);
}""
""public void postorder() {
if(left != null) left.postorder();
if(right != null) right.postorder();
System.out.println(value);
}""

7 Stampare i nodi postorder chiamando il metodo b.postorder dopo i vostri inserti.

""b.postorder();"

Consigli e avvertenze

  • Poiché ricorsione richiede spazio di stack, dovrebbe essere usato con attenzione. Se l'albero binario è molto grande, la funzione attraversamento dovrebbe essere implementato iterativamente.
  • Il metodo più complicato "nodo di eliminazione" non è supportato da questo esempio di classe.