Algoritmi in Java: Alberi - Parte 1
05-Jun-08
E finalmente dopo aver spiegato le definizioni e codici delle pile e code, siamo arrivato al tema degli alberi. Prima di iniziare vi darò alcune definizioni principali e le spiegherò nel modo più semplice possibile:
- Albero: Struttura formata da un primo elemento detto radice a cui sono collegati uno o più sottoalberi.
- SottoAlbero: Struttura formata da un primo elemento detto radice a cui sono collegati uno o più sottoalberi.
- Nodi: Sono gli elementi fondamentali di un albero. Si dividono in nodi interni e foglie.
- Nodi Interni: Sono i nodi che sono collegati a uno o più discendenti (figli).
- Foglie: Sono i nodi che non sono collegati a nessun discendente.
- Ramo: E' il legame che lega un nodo con un suo discendente.
- Padre: E' il nodo interno a cui è collegato almeno un altro elemento detto discendente o figlio.
- Figlio: Sono i nodi che non si possono raggiungere attraverso i collegamenti a partire da un nodo interno. Ogni nodo interno ha almeno un figlio. Il numero massimo di Figlio dipende dalla tipologia dell'Albero.
- Path (Percorso): Sono i rami che bisogna percorrere per raggiungere un elemento partendo dalla radice.
- Livello: E' il numero di rami che bisgona percorrere per raggiungere un elemento partendo dalla radice. E' la lunghezza del percorso.
- Altezza (Profondità): E' il massimo numero di rami che bisogna percorrere per una foglia. E' il percorso più lungo.
Esistono diverse tipologie di alberi (albero binario, albero ternario, albero quadernario...albero n-ario) ma quello che ci interessa in particolare sono gli alberi binari. Dentro a questa tipologia si trovano gli alberi binari di ricerca.
Alberi Binari di Ricerca:
E' un albero binario con una particolarità: Per tutti i nodi i valori contenuti nel sottoalbero sinistro sono minori dei valori contenuti nel sottoalbero destro.

Visita di un Albero:
E' l'accesso alle informazioni passando per ogni nodo una sola volta. Si utilizza un procedimento di tipo ricorsivo.
- Visita Anticipata o Pre-Ordine: Stampa la radice, dopodichè effettua una visita anticipata nel sottoalbero sinistro e poi nel sottoalbero destro. Facendo questo tipo di visita nell'albero precedente abbiamo: 8-4-2-6-12-10-13
- Visita Simmetrica o In-Ordine: Effettua una visita simmetrica nel sottoalbero sinistro, dopodichè stampa la radice e poi effettua una visita simmetrica nel sottoalbero destro. Facendo questo tipo di visita nell'albero precedente abbiamo: 2-4-6-8-10-12-13
- Visita Posticipata o Post-Ordine: Effettua una visita posticipata nel sottoalbero sinistro, dopodichè effettua una visita posticipata nel sottoalbero destro e poi stampa la radice. Facendo questo tipo di visita nell'albero precedente abbiamo: 2-6-4-10-13-12-8
In seguito pubblico un esempio che abbiamo elaborato con Carlos Alva:
-
public class Tree {
-
Tree left,right,root;
-
int val;
-
Tree(int v,Tree a,Tree b){
-
val=v;
-
left=a;
-
right=b;
-
}
-
Tree(int n){
-
this.val=n;
-
this.left=null;
-
this.right=null;
-
}
-
int getval(){
-
return this.val;
-
}
-
Tree getleft(){
-
return this.left;
-
}
-
Tree getright(){
-
return this.right;
-
}
-
public void Add(Tree T, int n){
-
if(n<T.val){
-
if(T.left==null){
-
Tree t=new Tree(n);
-
T.left=t;
-
T.left.root=T;
-
}else{
-
Add(T.left,n);
-
}
-
}else {
-
if(T.right==null){
-
Tree t=new Tree(n);
-
T.right=t;
-
T.right.root=T;
-
}else{
-
Add(T.right,n);
-
}
-
}
-
}
-
}
>
-
import java.util.*;
-
-
public class Stampa {
-
-
public static void Preordine(Tree t){
-
-
if(t!=null){
-
Preordine(t.left);
-
Preordine(t.right);
-
}
-
}
-
public static void Inordine(Tree t){
-
-
if(t!=null){
-
Inordine(t.left);
-
Inordine(t.right);
-
}
-
}
-
public static void Postordine(Tree t){
-
if(t!=null){
-
Postordine(t.left);
-
Postordine(t.right);
-
}
-
}
-
-
Tree t=new Tree(72);
-
int x[]={51,30,19,3,27,45,69,74,99,80};
-
for(int i=0;i<=x.length-1;i++){
-
t.Add(t,x[i]);
-
}
-
Stampa.Preordine(t);
-
Stampa.Inordine(t);
-
Stampa.Postordine(t);
-
}
-
}
Per oggi penso che sia sufficiente come prima parte, nella seconda spiegherò altri metodi che potranno essere aggiunti all'albero di ricerca. Se avete dubbi, domande potete contattarmi quando volete
, sia lasciando un commento o andando all'area Contact-me
Popularity: 23% [?]

