Problema com busca em arvore binaria!

1 resposta
IFMT
Ola eu estou com o seguinte problema naum esta dando certo minha busca na arvore abaixo!!!!
public TreeNode buscaBin(TreeNode r, long valor)  //metodo que faz busca na arvore binaria  
   {    
      if(r == null)    
        return null;    
      if(valor == r.getDado())    
        return r;    
      if(valor < r.getDado())        
        return(buscaBin(r.getEsq(),valor));    
      else      
        return(buscaBin(r.getDir(),valor));    
   }
class TreeNode
{
   // membros de acesso de pacote
   TreeNode leftNode; // nó esquerdo
   int data; // valor do nó
   TreeNode rightNode; // nó direito

   // construtor inicializa os dados e os torna um nó-folha
   public TreeNode( int nodeData )
   {
      data = nodeData;
      leftNode = rightNode = null; // o nó não tem nenhum filho
   } // fim construtor sem argumento TreeNode

   // localiza ponto de inserção e insere novo nó; ignora os valores duplicados
   public void insert( int insertValue )
   {
      // insere na subárvore esquerda
      if ( insertValue < data )
      {
         // insere novo TreeNode
         if ( leftNode == null )
            leftNode = new TreeNode( insertValue );
         else // continua percorrendo subárvore esquerda
            leftNode.insert( insertValue );
      } // fim do if
      else if ( insertValue > data ) // insere na subárvore direita
      {
         // insere novo TreeNode
         if ( rightNode == null )
            rightNode = new TreeNode( insertValue );
         else // continua percorrendo subárvore direita
            rightNode.insert( insertValue );
      } // fim de else if
   } // fim do método insert
} // fim da classe TreeNode

// definição da classe Tree
  class Tree
{
   private TreeNode root;
   private  int cont;

   // construtor inicializa uma Tree de inteiros vazia
   public Tree()
   {
      root = null;
      cont=0;
   } // fim construtor sem argumento Tree

   // insere um novo nó na árvore de pesquisa binária
   public void insertNode( int insertValue )
   {
      if ( root == null )
         root = new TreeNode( insertValue ); // cria o nó raiz aqui
      else
         root.insert( insertValue ); // chama o método insert
   } // fim do método insertNode

   // inicia percurso na pré-ordem
   public void preorderTraversal()
   {
      preorderHelper( root );
      System.out.println("  A quantidade de nós: "+cont);
   } // fim do método preorderTraversal

   // método recursivo para realizar percurso na pré-ordem
   private void preorderHelper( TreeNode node )
   {
      if ( node == null )
         return;
      System.out.printf( "%d ", node.data ); // gera saída de dados do nó
      preorderHelper( node.leftNode );       // percorre subárvore esquerda
      preorderHelper( node.rightNode );      // percorre subárvore direita
      cont++;
   } // fim do método preorderHelper

   // inicia percurso na ordem
   public void inorderTraversal()
   {
      inorderHelper( root );
   } // fim do método inorderTraversal

   // método recursivo para realizar percurso na ordem
   private void inorderHelper( TreeNode node )
   {
      if ( node == null )
         return;

      inorderHelper( node.leftNode );        // percorre subárvore esquerda
      System.out.printf( "%d ", node.data ); // gera saída de dados do nó
      inorderHelper( node.rightNode );       // percorre subárvore direita
   } // fim do método inorderHelper

   // inicia percurso na pós-ordem
   public void postorderTraversal()
   {
      postorderHelper( root );
   } // fim do método postorderTraversal

   // método recursivo para realizar percurso na pós-ordem
   private void postorderHelper( TreeNode node )
   {
      if ( node == null )
         return;

      postorderHelper( node.leftNode );      // percorre subárvore esquerda
      postorderHelper( node.rightNode );     // percorre subárvore direita
      System.out.printf( "%d ", node.data ); // gera saída de dados do nó
   } // fim do método postorderHelper
   public TreeNode buscaBin(TreeNode r, long valor)  //metodo que faz busca na arvore binaria
   {  
      if(r == null)  
        return null;  
      if(valor == r.getDado())  
        return r;  
      if(valor < r.getDado())      
        return(buscaBin(r.getEsq(),valor));  
      else    
        return(buscaBin(r.getDir(),valor));  
   }  
} // fim da classe Tree

1 Resposta

fantomas
// definição da classe Tree
  class Tree
{
   private TreeNode root;
   private  int cont;

   // construtor inicializa uma Tree de inteiros vazia
   public Tree()
   {
      root = null;
      cont=0;
   } // fim construtor sem argumento Tree

   // insere um novo nó na árvore de pesquisa binária
   public void insertNode( int insertValue )
   {
      if ( root == null )
         root = new TreeNode( insertValue ); // cria o nó raiz aqui
      else
         root.insert( insertValue ); // chama o método insert
   } // fim do método insertNode

   // inicia percurso na pré-ordem
   public void preorderTraversal()
   {
      preorderHelper( root );
      System.out.println("  A quantidade de nós: "+cont);
   } // fim do método preorderTraversal

   // método recursivo para realizar percurso na pré-ordem
   private void preorderHelper( TreeNode node )
   {
      if ( node == null )
         return;
      System.out.printf( "%d ", node.data ); // gera saída de dados do nó
      preorderHelper( node.leftNode );       // percorre subárvore esquerda
      preorderHelper( node.rightNode );      // percorre subárvore direita
      cont++;
   } // fim do método preorderHelper

   // inicia percurso na ordem
   public void inorderTraversal()
   {
      inorderHelper( root );
   } // fim do método inorderTraversal

   // método recursivo para realizar percurso na ordem
   private void inorderHelper( TreeNode node )
   {
      if ( node == null )
         return;

      inorderHelper( node.leftNode );        // percorre subárvore esquerda
      System.out.printf( "%d ", node.data ); // gera saída de dados do nó
      inorderHelper( node.rightNode );       // percorre subárvore direita
   } // fim do método inorderHelper

   // inicia percurso na pós-ordem
   public void postorderTraversal()
   {
      postorderHelper( root );
   } // fim do método postorderTraversal

   // método recursivo para realizar percurso na pós-ordem
   private void postorderHelper( TreeNode node )
   {
      if ( node == null )
         return;

      postorderHelper( node.leftNode );      // percorre subárvore esquerda
      postorderHelper( node.rightNode );     // percorre subárvore direita
      System.out.printf( "%d ", node.data ); // gera saída de dados do nó
   } // fim do método postorderHelper
   private TreeNode buscaBin(TreeNode r, long valor)  //metodo que faz busca na arvore binaria
   {  
      if(r == null)  
        return null;  
      if(valor == r.getDado())  
        return r;  
      if(valor < r.getDado())      
        return(buscaBin(r.getEsq(),valor));  
      else    
        return(buscaBin(r.getDir(),valor));  
   }
   // INICIO DA ALTERAÇÃO
   public long find(long valor)  //metodo que faz busca na arvore binaria
   {  
	   long result = 0;
	   
	   // Procura a chave na arvore
	  TreeNode node = buscaBin(this.root, valor);
	  
	  // Se achar algum nó, obtem o conteúdo
      if( node != null ) {  
        result = node.getDado();
      }
      
      return result;
   }  
   
   public static void main(String[] args) {
	   Tree tree = new Tree();
	   tree.insertNode(10);
	   tree.insertNode(2);
	   tree.insertNode(30);
	   tree.insertNode(4);
	   tree.insertNode(50);
	   tree.insertNode(62);
	   
	   System.out.println(tree.find(2));
   }
   // FIM DA ALTERAÇÃO
   
} // fim da classe Tree

Foi incluido o método find para encontrar o nó desejado e o método main para fazer o teste.

Faltou criar um método (find) que dispare a leitura da àrvore através da passagem do nó inicial (raiz) - no seu caso o root.

Como os nós apenas registram a chave ( data ) o método de busca volta sempre o mesmo valor que está sendo procurado, quando não encontra irá retornar o valor zero.

flws

Criado 16 de maio de 2010
Ultima resposta 17 de mai. de 2010
Respostas 1
Participantes 2