Erro em inserção em árvore binária

3 respostas
F

Quero fazer uma árvore binária simples. Ja tinha feito uma em C, mas estou tendo problemas em fazer em Java. Pelo que entendi, o problema esta ocorrendo no método insertNode. Quando o programa sai desse metodo, a raiz continua null.

private void insertNode(Node r, Node no){
       if(r==null && no!=null){
           r=new Node(new Pessoa(no.getPessoa().getNome(),no.getPessoa().getId()));
       }
       else{
           if(r.getPessoa().getNome().compareToIgnoreCase(no.getPessoa().getNome())<0){
               System.out.println("Esquerda");
               insertNode(r.getLNode(),no);
           }
           else{
               if(r.getPessoa().getNome().compareToIgnoreCase(no.getPessoa().getNome())>0){
                   System.out.println("Direita"); 
                   insertNode(r.getRNode(),no);
               }
            }
       }
   }

o código completo do programa é o seguinte:

class Pessoa{
    private String nome;
    private int id;
    
    public Pessoa(String n, int i){
       nome=n;
       id=i;
    }
    
    public String getNome(){
        return nome;
    }
    
    public int getId(){
        return id;
    }
    
    public String toString(){
        return nome+" : "+String.valueOf(id);
    }
}


class Node{
    private Node lNode;
    private Node rNode;
    private Pessoa p;
    
    
    public Node(){
        lNode=null;
        rNode=null;
    }
    
    public Node(Pessoa pes){
        p=pes;
        lNode=null;
        rNode=null;
    }
    
    
    public void lAdd(Node no){
        lNode=no;
    }
    
    public void rAdd(Node no){
        rNode=no;
    }
    
    public Pessoa getPessoa(){
        return p;
    }
    
    public Node getRNode(){
        return rNode;
    }
    
    public Node getLNode(){
        return lNode;
    }
    
    public String toString(){
        return p.toString()+" d:"+rNode+" e:"+lNode;
    }
    
}

class Arvore{
   private Node raiz;

   public Arvore(){
    
    }
   
   public boolean raizNull(){
    //retorna true se a raiz é null
       if(raiz==null)
           return true;
       else
           return false;
   }
   
   public void add(Pessoa p){
       Node noTmp=new Node(p);
       insertNode(raiz,noTmp);
   }
   
   public void setNode(Node n1, Node n2){
       n1=n2;
   }
   
   public void add(Node no){
       if(raizNull()==true)
           this.setNode(raiz, no);
       else
           insertNode(raiz,no);
   }
   
   private void insertNode(Node r, Node no){
       if(r==null && no!=null){
           r=new Node(new Pessoa(no.getPessoa().getNome(),no.getPessoa().getId()));
       }
       else{
           if(r.getPessoa().getNome().compareToIgnoreCase(no.getPessoa().getNome())<0){
               System.out.println("Esquerda");
               insertNode(r.getLNode(),no);
           }
           else{
               if(r.getPessoa().getNome().compareToIgnoreCase(no.getPessoa().getNome())>0){
                   System.out.println("Direita"); 
                   insertNode(r.getRNode(),no);
               }
            }
       }
   }
   
   public Pessoa procura(String n){
       return find(raiz,n);
   }
   
   private Pessoa find(Node no,String n){
       if(no==null)
           return null;
       else{
           if(no.getPessoa().getNome().compareToIgnoreCase(n)<0)
               return find(no.getLNode(),n);
           if(no.getPessoa().getNome().compareToIgnoreCase(n)>0)
               return find(no.getRNode(),n);
           if(no.getPessoa().getNome().compareToIgnoreCase(n)==0)
               return no.getPessoa();
       }
       return null;
   }
   
   public void imprime(){
       printTree(raiz);
   }
   
   private void printTree(Node n){
       if(n!=null){
           printTree(n.getRNode());
           System.out.println(n.getPessoa().toString());
           printTree(n.getLNode());
       }
   }
       
}

public class JArvoreBinaria {

    public static void main(String[] args) {
        Arvore tree=new Arvore();
        Pessoa p[]=new Pessoa[7];
        
        p[0]=new Pessoa("Carlos",10);
        p[1]= new Pessoa("Joao",01);
        p[2]= new Pessoa("Maria", 02);
        p[3]= new Pessoa("Vermilion", 03);
        p[4]= new Pessoa("Jose", 04);
        p[5]= new Pessoa("Paty", 05);
        p[6]= new Pessoa("Ana",06);
        
        for(int i=0;i<=6;i++){
            tree.addIt(new Node(p[i]));
        }
        
        Pessoa p7=tree.procura("teste");
        if(p7!=null)
            System.out.println(p7.toString());
        else
            System.out.println("\nNao achou");
            
        tree.imprime();
        
    }

}

Alguem poderia, por favor, me dizer onde está meu erro? Porque o elemento não é inserido na árvore?

Agradeço desde já.
Ricardo Farinhaki

3 Respostas

ViniGodoy

Você deve associar o r criado no método insertNode ao pai dele.

No método, você só cria r, mas não faz mais nada com ele.

F

Como faço isso?
pq, como o r é um argumento do método, achei que ele ja era associado à referencia para o nó.

ViniGodoy

Você terá que passar o Nó pai como parâmetro, e então fazer:

pai.rNode = r;

ou

pai.lNode = r;

quando apropriado.

Quando passar coisas por parâmetro, lembre-se que o Java trabalha com cópias. r é uma variável que é uma cópia da referência para pai.rNode (ou lNode). Se você alterar o valor de r, está alterando o valor da cópia, e não de rNode ou lNode. Por isso, é necessário passar tb o pai no parâmetro.

Criado 17 de abril de 2009
Ultima resposta 18 de abr. de 2009
Respostas 3
Participantes 2