Estrutura de Dados(Java) - Arvore Binaria

8 respostas
G

Pessoal eu tenho que fazer uma rotina que conte quantos niveis a na arvore binaria. Exemplo:
-50-
-30-,-70-
-10-,-25-,-80-,-85-

Esta arv tem três niveis… Agora eu fiz este procedimento para verificar se acha três niveis… Eis o codigo abaixo:

public ListaSE Quant(int n){
 
 return Quant(n);
}

private ListaSE Quant(ListaSE r, int n){
int nivel = 0,nivel1 = 0;

 if(r != null)
   nivel +=1;
    if(n == r.getValor())
          return nivel;
    else
      if(n > r.getValor())
          return Quant(r.getDir(),n);
      else
          return Quant(r.getEsq(),n);
    else
         return 0;
          
}

Alguem saberia me dizer se esta certo ou quase certo? Se tiver errado, onde posso arrumar? grato.

8 Respostas

B

Ola,

Olha, pelo que vi rapidamente aqui tá quase lá

Mas poste ae pra gente a classe ListaSE, pra gente dar um pitaco :grin:

Outra, o seu metodo retorna, de acordo com a ssinatura, um ListaSE, e no corpo do metodo vc tá retornando um int… vai dar erro de compilação.[/code]

G
public class ListaSE {
	
	private int valor;
	private ListaSE prox,ini,fim,esq,dir;
	
	public ListaSE(){
		valor = 0;
		prox = null;
		ini = null;
		fim = null;
		esq = null;
		dir = null;
			
	}
	
	public void setEsq(ListaSE e)
	 {esq = e;}
	 
	public void setDir(ListaSE d)
	 {dir = d;} 
	public void setProx(ListaSE n)
	 {prox = n;}
	
	public void setValor(int v)
	 {valor = v;}
	
	public void setInicio(ListaSE i) 
	 {ini = i;}
	
	public void setFinal(ListaSE f)
	 {fim = f;}
	
	public ListaSE getEsq()
	 {return esq;}
	 
	public ListaSE getDir()
	 {return dir;}
	  
	public ListaSE getInicio()
	 {return ini;}
	
	public ListaSE getFinal()
	 {return fim;}  
	  
	public ListaSE getProx()
	 {return prox;}
	
	public int getValor()
	 {return valor;} 
	 
	public void pushIni(int v){
		
	  ListaSE aux = new ListaSE();
	   aux.setValor(v);
	   aux.setProx(ini);
	   if(ini == null)
	      fim = aux;
	      ini = aux; 
	} 
	

	
	public int popIni(){
		
		ListaSE aux = new ListaSE();
		aux = ini;
		if(aux!=null){
		
		   fim = null;
		   return aux.getValor();
		}
		return -99999;   
		   
	}
	
	public void show(){
		ListaSE aux = new ListaSE();
		aux = ini;
		
		while(aux!=null){
			System.out.print(aux.getValor()+"\t");
			aux = aux.getProx();
		}
	}	
	 
	 
	
}

Deu para perceber… Como faço então só para marcar um nivel?

B

Ola

Cara, em árvore não existe um “proximo” ou “fim”… mas sim direira/esquerda, ou maior/menor…

Sem querer me meter demais na sua implementação… mas acho que fica mais facil…

Metodo mais facil de fazer esta arvore é:
1-> Crie uma classe Denominada “No”, que pode ser um nó ou uma folha.
ela tem como atributos, o dado, no teu caso um int, e aponta para um outro “No” da direita e esquerda. Ela é um No quando a direita ou esquerda dela esta diferente de null, se os dois estiverem nulos ela é uma folha. ex.:

public class No{
  private int dado;
  private No maior;
  private No menor;

  public No(int dado){
    this.dado = dado;
  }

  //get's e set's
}

2->para o caso de inserção, percorra a arvore até o o novo dado se “encaixe”, +/- assim:

public void addFolha(No no, int dado){ if(dado == no.getDado()){ throw new IllegalArgumentException("Nó já existe"); // para o caso de não poder ter dois nós iguais.. } if(dado > no.getDado()){ if(no.getMaior() != null){ addFolha(no.getMaior(), dado); return; }else{ no.setMaior(new No(dado)); return; } }else{ // a mesma coisa do body do if acima.. mas usando o menor... }
3-> pra vc verificar a profundidade da arvore fica mais facil… seguindo o mesmo raciocínio que vc usou…

public int getProfundidade(No no){ int profMaior = 0; int profMenor = 0; if(no.getMaior != null){ profMaior += getProfundidade(no.getMaior()); } if(no.getMenor() != null){ profMenor += getProfundidade(no.getMenor()); } if(profMaior > profMenor){ return profMaior; }else{ return profMenor; } }

Sem querer mudar muito sua idéia inicial… mas vê o que vc pode aproveitar ae…

G

Olá BrunoCarlo! Ultima resposta tua muda tudo que era antes. Mas assim do jeito que voce escreveu ficou mais facil de entender… Ok! Outra coisa! A classe no não precisa mais da outra classe ListaSE?
Eu entendi que ela funciona sem a ListaSE. É isso mesmo? Grato.

B

E isto mesmo, a classe que te mostrei nao tem nada com a tua.

Pelo que vi depois e que vc tava confundindo arvore binaria com lista.

G

Olha só! Eu queria criar a raiz da minha arvore. Neste procedimento aqui…

public void insere(int v){
		No aux = new No();
		No aux1 = new No();
                                \setRaiz() =  No
                                \setValor() = inteiro		
                                aux.setValor(v);
	    aux1 = aux;
	    aux.setRaiz(aux1);

Eu fiz isto aqui:
entra um arg inteiro… no setValor() e depois ele é trasformando em raiz. Atraves do setRaiz… Só que ele não da certo!!! O codigo para mostar a arvore é este aqui!

public void show(){
	  No aux = new No();
	  if(aux != null){
	  	System.out.println(aux.getRaiz()+"\n");
	  }

E ele retorna um grupo de caractere muito estranho ou ele retorna null…
Sabe onde to errando?

B

Ola

cara, pra criar uma raiz para a sua arvore vc não precisa de um método, só vc usar um atributo a classe que vc tá usando como main… pode colocar ele até estático… pq é dele que vai acontecer o resto… um exemplo baseado na idéia que nos conversamos anteriormente:

public class No...

public class ProcessaArvore{ // supondo que vc criou uma classe que faz as operações com a arvore, tais como adicionar, remover, exibir...

public class Main{// classe de onde vai começar tudo.

  public static No raiz;

Ae pra criar a raiz vc só verifica se a variável esta nula ou não…

Entendeu?

R

Não seria o caso de usar um Composite aí?

Criado 12 de setembro de 2006
Ultima resposta 23 de out. de 2006
Respostas 8
Participantes 3