PDA

View Full Version : [java] problema con albero di ricerca binario


wizard1993
29-06-2008, 15:19
sto implementando un classe che gestica un albero di ricerca binario
e ho scritto questo codice


public class tree {
private node root=new node();
private void insert(node root,int data){
if(root==null){
root=new node();
root.data=data;
System.out.println(data);//testcase
}
else{
if(root.data==null){
root.data=data;

}
else{

if(data>root.data){
this.insert(root.destra,data);
System.out.print("a"); //testcase
}
else{
this.insert(root.sinistra, data);
System.out.print("a"); //testcase
}
}
}
}
public void insert(int data){
this.insert(root, data);
}

public void get(){
this.get(root);
}
private void get(node root){

if(root==null)return;
else{
this.get(root.sinistra);
System.out.println(root);
this.get(root.destra);
}
}
}
class node{
node sinistra,destra;
Integer data;
@Override
public String toString(){
return data.toString();
}
}

il mio problema è che quando vado a chiamare il metodo get questo non visualizza nulla; io purtroppo non ci vedo alcun errore; potete per favore darci un occhio?
uso netbeans 6.1

wingman87
29-06-2008, 15:41
Ciao, io vedo un errore nella insert, però in teoria la get dovrebbe stamparti almeno il valore della radice (o NULL se non ci hai messo niente).
L'errore è qui:
else{
if(data>root.data){
this.insert(root.destra,data);
System.out.print("a"); //testcase
}else{
this.insert(root.sinistra, data);
System.out.print("a"); //testcase
}
}

Quando richiami this.insert passi un riferimento a root.destra o a root.sinistra, solo che se questi non sono stati inizializzati stai passando un riferimento a NULL, quindi i nodi che creerai in quella invocazione andranno persi. Puoi risolvere così:
else{
if(data>root.data){
if(root.destra==NULL)
root.destra=new node();
this.insert(root.destra,data);
System.out.print("a"); //testcase
}else{
...

wizard1993
29-06-2008, 15:57
grazie infinite; ho risolto;
adesso la classe fa quel che deve fare
comunque prima il get non stampava nemmeno null; comunque ora che ho risolto credo che il problema sia risoltp

feboss
29-06-2008, 20:21
L'inserimento così non va meglio?
public void insert(node root, int data)
{
if (root == null)
root = new Node(data)
else if (data > root.data)
{
this.insert(root.destra, data);
System.out.print("a"); //testcase
}
else if (data < root.data)
{
this.insert(root.sinistra, data);
System.out.print("a"); //testcase
}
}
se togli i testcase puoi togliere le graffe e cosi il codice viene bellissimo :D