Implementação árvores ABB

4 respostas
M

Olá,

Estou precisando de uma grande ajuda para fazer o seguinte: através de uma tela de cadastro, tenho que obter as informações digitadas pelo usuário, exemplo: Cadastrar um livro, então vou precisar do título, autor, ano, editora, com isso, tenho que gravar essas informações na forma de objetos, mas como vou fazer para vincular essas informações à árvore ABB?!?!?! pois se eu atribuir o objeto livro à arvore, como vou vincular a ela seus atributos?!
tô perdida!!!..rs
desde já agradeço!!!
um abraço!

4 Respostas

_

Para inserir um objeto Livro em qualquer árvore, você deve colocar estes atributos (nome, autor, etc), dentro da classe, e esta deve implementar a interface Comparable, e ter o método compareTo, pois as árvores ordenam seus elementos a partir deste método. Voce deve indeicar como os livros serão comparados, se será pelo nome do livro, pelo autor, etc. e este método retorna 0 se os objetos forem iguais, -1 se o objeto this vier antes de objeto do argumento e 1 se vier depois.

public class Livro implements Comparable {

//…

public int compareTo(Object outro) {

se nome < nome do outro return -1

se nome > nome do outro return 1

senao return 0

}
}

Espero que seja esta sua dúvida
Valeu()

A

Olá,

Estou com o mesmo problema da minha amiga ali em cima. O que acontece é o seguinte. Temos que criar uma interface de cadastro de referencias bibliograficas e associar à uma árvore ABB. Conseguimos guardar apenas o valor de um atributo na variavel dado . Gostaria de saber como posso fazer pra salvar todos os atributos(codigo, titulo, autor, ano…) relacionados ao meu objeto livro e armazena-lo no Nó da arvore ABB ?

Segue exempleo do código que estamos utilizando abaixo.

//Insere um elemento na árvore

public No insertABB( No raiz, String e )

{

//Se a raiz não estiver vazia, e tiver um valor vazio, alterar

if(!isEmpty() && raiz != null && raiz.getDado().equals(""))

{

raiz.setDado(e);

return raiz;

}

else

{

if ( raiz == null )

return new No( e );
//Se for menor que a raiz, inserir à esquerda
    if (e.compareTo( raiz.getDado() ) &lt; 0) 
    {
      raiz.setEsq(insertABB( raiz.getEsq(), e ));
    } 
    
    //Senão, inserir á direita
    else 
    {
      raiz.setDir(insertABB( raiz.getDir(), e ));
    }
    return raiz;
}

}

//Altera o dado do nó
public void setDado(String novo)
{
	this.dado = novo;
	
}

Obrigado

_

Acontece que o objeto No está guardando uma String, voce deve implementar uma classe No onde o dado guardado do no seja um objeto, :lol: tipo voce quer criar uma arvore de Livros entao a classe no deve conter:

private No filhoDireita;

private No filhoEsquerda;

private No pai;

private Livro dado;

Na classe Livro voce implementa o compareTo e coloca no cabecalho implements Comparable:

public Livro implements Comparable {

private String nome;

private String autor;

//…etc
//…

public int compareTo(Livro outro) {

if(nome.compareTo(outro.getNome()) < 0) return -1;

if(nome.compareTo(outro.getNome()) > 0) return 1;

return 0;

}
public int compareTo(Object outro) {

return compareTo((Livro)outro)

}

}

ento voce podera normalmente inserir o No na arvore como voce esta fazendo!

qualquerDuvidaAvise()

_

Olá,
O problema na classe No é que você está tratando o dado (tipo Livro) como se fosse uma String, o que na verdade nao é. Você teria que fazer o seguinte (marcarei as alterações):

Código classe No

public class No implements Comparable 

{

//Dados do nó

private Livro dado;

private No esq;

private No dir;

private No pai; // Nao conheco arvore ABB mas eu acho que todo no deve ter um apontador para o no pai

/*Construtor sem parâmetros

Nao seria necessario, pois todo Object tem um construtor sem parametros, onde todos os atributos sao Null

public No()

{

this(null,null,null);

} */
// Seria necessario apenas este:

public No(Livro _dado)

{

dado = _dado;

esq = null;

dir = null;

}
//Altera o dado do nó

public void setDado(Livro novo)

{

dado = novo;

}

//Retorna o dado do nó

public String getDado()

{

return dado;

}
//Altera o filho esquerdo

public void setEsq(No _esq)

{

this.esq = _esq;

}
//Altera o filho direito

public void setDir(No _dir)

{

this.dir = _dir;

}
//Retorna o nó esquerdo

public No getEsq()

{

return esq;

}
//Retorna o nó direito

public No getDir()

{

return dir;

}
[b]//Altera o Pai

public void setPai(No _pai)

{

pai = _pai;

}
//Retorna o nó esquerdo

public No getPai()

{

return pai;

}
public int compareTo(No outro) {

if(dado.compareTo(outro.getDado()) < 0) return -1;

if(dado.compareTo(outro.getDado()) > 0) return 1;

return 0;

}[/b]

}

classe livro com um contrutor
public class Livro implements Comparable
{
//dados do livro

private String cod,tit,aut,ano,tipo,veic,imag;

public void salvaLivro(String _cod,String _tit,String _aut,String _ano,String _tipo, String _veic,String _imag)

{

this.cod = _cod;

this.tit = _tit;

this.aut = _aut;

this.ano = _ano;

this.tipo = _tipo;

this.veic = _veic;

this.imag = _imag;

}
public int compareTo(Livro outro) {

if(tit.compareTo(outro.getTitulo()) < 0) return -1;

if(tit.compareTo(outro.getTitulo()) > 0) return 1;

return 0;

}

}

O No precisa ter apenas um construtor para gravar o dado nele, e todos os apontadores do No sao null, pois apenas na hora da inserção é que eles sao alterados, e nao durante a criacao. Para inserir utiliza-se o metodo compareTo de No, que pega o compareTo de livro.

esperoTerAjudado()

Criado 31 de outubro de 2004
Ultima resposta 6 de nov. de 2004
Respostas 4
Participantes 3