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.
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();"