Árvore Binária e AVL - problema com lógica

3 respostas
Leandro_M

Olá pessoal

estou com um problema para implementar um código.
na verdade eu preciso saber como funciona o esquema lógico de implematação de um método que dado um nó, o método verifique a altura da árvore (verifiquei que a altura é o "nível máximo de seus nós") e outro método que verifique se uma árvore é binária ou AVL.
como poderia fazer isso de maneira lógica?
queria saber se alguém pode me ajudar.
uma explicação de como funciona está de bom tamanho. fiz uma pesquisa não ahcei nada (talvez não tenha procurado direito).

SEGUE O CÓDIGO QUE FAZ A INSERÇÃO E BUSCA DE UM NÓ EM UMA ÁRVORE BINÁRIA.

public class No {
       private int Elem;
       private No esq, dir;
       public No(int elem){ 
               setElem (elem);
               esq = null;
               dir = null;
       }
       public void setElem(int elem){
               Elem = elem;
       }
       public int getElem (){ 
               return (Elem);
       }
       public void setEsq (No e){
               esq = e;
       }
       public No getEsq (){
               return (esq);
       }
       public void setDir (No d){ 
               dir = d;
       }
       public No getDir (){
               return (dir);
       }
     }
import javax.swing.*;
public class TarvoreBin {
       private No raiz;

       public TarvoreBin (){
               raiz = null;
       }
       public boolean arvoreVazia(){
               if (raiz == null){
              return true;
               }
               else{
                       return false;
               }
       }
       public No getRaiz (){
               return (raiz);
       }
       public No criaRaiz(int elem){
               No novoNo = new No (elem);
               raiz = novoNo;
               return  (novoNo);
       }
       public No inserDir (No pai, int elem){
               if (! arvoreVazia ()){ 
                       if (pai.getDir() !=null){
                               System.out.println("Filho direito já ocupado");
                                       return null;
                       }else{ 
                               No novoNo = new No (elem);
                               pai.setDir(novoNo);
                               return (novoNo);

                       }

               } 
               return (null);

       }
       public No inserEsq (No pai, int elem){
              if(! arvoreVazia ()){
                 if(pai.getEsq()!= null){ 
                    System.out.println("Filho Esquerdo já ocupado");
                         return (null);
                   }else{ 
                      No novoNo = new No (elem);
                       pai.setEsq (novoNo);
                        return (novoNo);
                   } 


            }
         return (null);
       }


       public boolean busca_Abb ( No r, int elem){
		int sair = 1;
		boolean retorno = false;	
               while (sair != 4){
               	
               	if (r.getDir() != null || r.getEsq() != null){    
                       if(elem == r.getElem()){
                                retorno = true;
                       }else{
                       if(elem < r.getElem()){
                             r = r.getEsq();
                             if(elem == r.getElem()){
                                        retorno = true;
                                        } 
                       }
                       if(elem > r.getElem()){
                                r = r.getDir();
                                if(elem == r.getElem()){
                                retorno = true;
                                }
                           }
                         }
                       }
                        sair++;
                }
                
                if(!retorno){
                   System.out.println("Numero Nao Achado..");
                       }else{
                       System.out.println("Numero ENCONTRADO");
                       }
                return retorno;
     }




public void InsereABB(int val){
    	if (arvoreVazia()){
    		No novoNo = new No (val);
    		raiz = novoNo;
    	}
    	else InsereNo(raiz, val);
    }
    
    private void InsereNo(No r, int v){
    	if (v < r.getElem()){
    		if(r.getEsq() == null){
    			No novoNo = new No (v);
    			r.setEsq(novoNo);
    		}
    		else InsereNo(r.getEsq(), v);
    	}
    	else if(v > r.getElem()){
    		if (r.getDir() == null){
    			No novoNo = new No (v);
    			r.setDir(novoNo);
    		}
    		else InsereNo(r.getDir(), v);
    	}
    }
import javax.swing.*;
public class Pesquisa {
    
    public static void main(String[] args) {
        No no;
        TarvoreBin arvore = new TarvoreBin();
        int incluiInt = 1;

        while( incluiInt != 0){
        String inclui = JOptionPane.showInputDialog("Digite os valores \n\n[0] --> para sair");
        incluiInt = Integer.parseInt(inclui);
        arvore.InsereABB(incluiInt);
        }
        String busca = JOptionPane.showInputDialog("BUSCA ");
        int buscaInt = Integer.parseInt(busca);
        
        arvore.busca_Abb(arvore.getRaiz(), buscaInt);
    }
}

Obrigado!

3 Respostas

Dieval_Guizelini

Observe que você está utilizando uma árvore binária, e neste caso, o problema maior é determinar a lógica dos nós. No programa que você apresentou não existem os operadores de rotação que permitira balancer a sua árvore, logo ela será balanceada apenas nos casos em que a inserção for o caso ótimo (ordem de entrada para valores de 0 a 100 seguir: 50, 25, 75 12, 37…).

No seu caso, a altura máxima dos nós será o número de elementos, veja, no pior caso você insere os valores [50,25,12,6,3,1]. Logo para 5 elementos você irá possuir 5 nós e 5 elementos a serem pesquisados, mas como é uma árvore binária mas não balanceada, a pesquisa média será dada por N x log2 n. Enquanto que na balanceada, a média será de log2( n ).

Binária sempre, AVL somente se o número de elementos abaixo de cada nó forem iguais ou a diferença menor que 2.

Dica: de uma olhada em pré-ordem e pós-ordem, vai te ajudar.

fw

Ps: Uma árvore binária completa com n>0 nós tem altura mínima, que é igual a 1 + floor(log (n)).

RenatoSouza

De uma olhada nesse site:

http://www.gpec.ucdb.br/pistori/

Clique em :
Teaching ->Árvore AVL

Leandro_M

valeu pessoal
valeu pela ajuda
grato,

Criado 30 de setembro de 2007
Ultima resposta 2 de out. de 2007
Respostas 3
Participantes 3