Como fazer uma busca e comparar elemento à elemento em uma Árvore Binária?

14 respostas
H

Oi, boa noite a todos. Estou com muita dificuldade em um programa que fiz aqui. Ele esta em C++, é uma árvore de dados. Ela tem um menu, com vários cases (casos). Não estou conseguindo realizar uma busca por elemento específico e informar quantas comparações são necessárias. Alguém pode me ajudar?
O código é esse:

// a17p_01_tree.cpp - Cria uma árvore binária - binary tree
#include

using namespace std;
#include “Treenode.h” // definição da classe TreeNode

TreeNode* createTree(); // 1) para criar uma árvore

void insertTree ( TreeNode*, int ); // 2) para o nó de inserção na Árvore

void printinOrderTraversal ( TreeNode* ); // 4) para imprimir inOrderTraversal Tree ( Em ordem )

void printTree ( TreeNode*, int );

void printpreOrderTraversal ( TreeNode* ); // 7) para imprimir a Árvore em preOrderTraversal

void printpostOrderTraversal ( TreeNode* );

//void deleteelementspecificTree ( TreeNode* );

void searchs_pecific_comparisonsTree ( TreeNode* );

int heightTree ( TreeNode* );

int main()

{

TreeNode *rootNodePtr = 0; // ponteiro para a raiz

int d, choice;

//int k;

//cout << “\n Qual o elemento chave voce quer apagar?”;

//cin >> k;
do // realiza ações selecionadas pelo usuário
    {
        cout << "\n\n_______________________________________________________________________\n";
        cout << "Escolha uma das seguintes operacoes para Arvore:\n\n"
            << " 1) para criar uma Arvore\n"
            << " 2) para o no de insercao\n"
            << " 3) para imprimir Arvore em Ordem Transversal\n"
            << " 5) ao final do tratamento da Arvore\n"
            << " 6) Impressao da Arvore em niveis\n"
            << " 7) Impressao da Arvore em Pre - Ordem Transversal\n"
            << " 8) Impressao da Arvore em Pos - Ordem Transversal\n"
            << " 9) Altura da Arvore\n"
            << " 10) Apagar um elemento especifico\n";


            cin >> choice;

            switch ( choice )
                {
                    case 1:
                        rootNodePtr = createTree();
                        break;

                    case 2:
                        if ( rootNodePtr == 0 )
                            {
                                cout << "\n A Arvore esta vazia, a criacao do ROOT \n";
                                rootNodePtr = createTree();

                            }

                            else
                                {
                                    cout << "\n Os dados de entrada do no = ";
                                    cin >> d;
                                    insertTree ( rootNodePtr, d );
                                }
                                break;

                    case 3:
                        if ( rootNodePtr == 0 )
                            cout << "\n A Arvore esta vazia!!!\n";

                            else
                                {
                                    cout << "\n_______________________________Imprimir Arvore em Ordem Transversal:________________________________\n" << endl << endl;
                                    printinOrderTraversal ( rootNodePtr );

                                }
                                break;
                    default:
                            cout << "Escolha a opcao correta" << endl;
                            break;


                   case 6:
                        if ( rootNodePtr == 0 )
                        cout << "\n ________________________________________Imprimir Arvore em niveis:_______________________________________________\n" << endl << endl;
                        printTree ( rootNodePtr, 0 );
                        break;

                   case 7:
                        if ( rootNodePtr == 0 )
                           cout << "\n A Arvore esta vazia!!!\n";

                           else
                               {
                                   cout << "\n________________________________Impressao da Arvore em pre-Ordem Transversal_________________________________________\n" << endl << endl;
                                   printpreOrderTraversal ( rootNodePtr );
                               }
                        break;

                    case 8:
                         if ( rootNodePtr == 0 )
                            cout << "\n A Arvore esta vazia!!!\n";

                            else
                                {
                                    cout << "\n__________________________________Impressao da Arvore em pos-Ordem Tranversal_________________________________________\n" << endl << endl;
                                    printpostOrderTraversal ( rootNodePtr );
                                }
                         break;

                    case 9:
                         if ( rootNodePtr == 0 )
                         cout << "\n A altura da Arvore e' 0!!!\n";

                         else
                             {
                                 cout << "\n________________Altura da Arvore___________________" << endl << endl;
                                 cout << heightTree ( rootNodePtr );
                             }
                         break;

                    case 10:
                         if ( rootNodePtr == 0 )
                         cout << "\n A Arvore esta vazia !!!\n";

                         else
                             {
                                 cout << "\n________________ Elemento Apagado_________________" << endl << endl;

// deleteelementspecificTree ( rootNodePtr );

}
                         break;
                         
                    case 11:
                         if ( rootNodePtr == 0 )
                         cout << "\n A Arvore esta vazia !!!\n";
                         
                         else
                             {
                                 cout << "\n_____________________Elemento de compração e Busca _______________" << endl << endl;
                                 searchs_pecific_comparisonsTree ( rootNodePtr );
                                 
                                 }
                         break;
                                 






                }
    } while ( choice != 5 );

    return 0;

}

// 1) Para criar uma Árvore _______________________________________________________________________________________________________________________________

TreeNode* createTree()

{

//   int d;

//   TreeNode *rootNodePtr = new TreeNode();

//   return rootNodePtr;
int d;

TreeNode *rootNodePtr = new TreeNode();

cout<<"\n Entrada do primeiro no (no raiz) dos dados  = ";

cin>>d;

rootNodePtr -> setData(d);

rootNodePtr -> setLeftPtr(0);

rootNodePtr -> setRightPtr(0);

return rootNodePtr;

}

// 2) ao modo de inserção na nova Árvore____________________________________________________________________________________________________________________

void insertTree ( TreeNode* rNodePtr , int d )

{

if ( ( d < rNodePtr -> getData() ) && ( rNodePtr -> getLeftPtr() == 0 ) )

{ // criar e inserir a esquerda da folha

TreeNode *NewNodePtr = new TreeNode(); // criar um novo elemento da árvore

NewNodePtr -> setData(d);

NewNodePtr -> setLeftPtr(0); // definir 0 à esquerda

NewNodePtr -> setRightPtr (0); // define 0 à direita

rNodePtr -> setLeftPtr ( NewNodePtr );

return;

}

else if ( d < rNodePtr -> getData() )

{

insertTree ( rNodePtr -> getLeftPtr(), d );

}
else if ( ( d > rNodePtr -> getData() ) && ( rNodePtr -> getRightPtr() == 0 ) )
{ // criar e inserir como uma folha de direito
    TreeNode *NewNodePtr = new TreeNode(); // criar um novo elemento da árvore
    NewNodePtr -> setData(d);
    NewNodePtr -> setLeftPtr(0); // define 0 à esquerda
    NewNodePtr -> setRightPtr(0); // define 0 à direita
    rNodePtr -> setRightPtr ( NewNodePtr );
    return;
}
else if ( d > rNodePtr -> getData() )
{
    insertTree ( rNodePtr -> getRightPtr(), d );

    }

    else
    cout << "\n O lemento inserido, ja existe na lista" << endl << endl;

}

// 3) para imprimir árvore, em Ordem Transversal_______________________________________________________________________________________________________________

void printinOrderTraversal ( TreeNode* rNodePtr )

{

if ( rNodePtr != 0 ) // A árvore não está vazia

{

printinOrderTraversal ( rNodePtr -> getLeftPtr() );

rNodePtr -> printData();

printinOrderTraversal ( rNodePtr -> getRightPtr() );

}
return;

}

// 6) para imprimir a Árvore em nível________________________________________________________________________________________________________________________

void printTree ( TreeNode* rNodePtr, int totalSpace )

{

if ( rNodePtr == 0 )

return;
else
    {
        printTree ( rNodePtr -> getRightPtr(), totalSpace+6 );
        for ( int i = 1; i < totalSpace; i++ )
            cout << " ";
        rNodePtr -> printData();
        cout << endl;
        printTree ( rNodePtr -> getLeftPtr(), totalSpace+6 );

    }

}

// 7) para imprimir a Árvore em preOrderTraversal_____________________________________________________________________________________

void printpreOrderTraversal ( TreeNode* rNodePtr )

{

if ( rNodePtr != 0 ) // A árvore não está vazia

{

rNodePtr -> printData();

printpreOrderTraversal(  rNodePtr -> getLeftPtr() );//2

printpreOrderTraversal( rNodePtr -> getRightPtr() );//3
}

return;

}

// 8) para imprimir a Árvore em posOrdem Transversal_______________________________________________________________________________________

void printpostOrderTraversal ( TreeNode* rNodePtr )

{

if ( rNodePtr != 0 ) // A árvore não está vazia

{

printpostOrderTraversal ( rNodePtr -> getLeftPtr() );

printpostOrderTraversal ( rNodePtr -> getRightPtr());

rNodePtr -> printData();

}
return;

}

// 9) Para calcular a altura da árvore______________________________________________________________________________________________________

int  heightTree ( TreeNode* rNodePtr )

{

if ( rNodePtr == 0 ) // a altura de uma árvore vazia é 0.

return 0;
else if ( rNodePtr -> getLeftPtr() != 0 )

        return 1+ ( heightTree ( rNodePtr -> getLeftPtr()));

        else if ( rNodePtr -> getRightPtr() != 0 )
        return 1+( heightTree ( rNodePtr -> getRightPtr() ));


    else
        {
            return 1+ max (( heightTree ( rNodePtr -> getLeftPtr())),( heightTree (rNodePtr -> getRightPtr() )));

            }

}

int max ( int a, int b )
{
if ( a > b )
return a;

else
return b;
}

Aqui entraria o código para fazer a busca e comparar elemento à elemento.

14 Respostas

A

Tenta isso:

public Node busca(String obj) {
		Node current = firstNode;
		while (current != null) {
			if (current.getData().equals(obj)) {
				return current;
			}
			current = current.getNext();
		}
		return null;
	}
H

public Node busca(String obj) {

Node current = firstNode;

while (current != null) {

if (current.getData().equals(obj)) {

return current;

}

current = current.getNext();

}

return null;

}

Mais eu tenho que criar essa classe String obj? E essa equals, o que é? Não entendi esse obj. O que é?

A

Foi malz cara, coloquei o método errado era para lista duplamente encadeada, abaixo vai o método para Arvore

public BSTNode search(int el) {
		return search(root, el);
	}

	private BSTNode search(BSTNode p, int el) {
		while (p != null) {
			/* se valor procurado == chave do no retorna referencia ao no */
			if (el == p.key)
				return p;
			/*
			 * se valor procurado < chave do no, procurar na sub-arvore esquerda
			 * deste no
			 */
			else if (el < p.key)
				p = p.left;
			/*
			 * se valor procurado > chave do no, procurar na sub-arvore direita
			 * deste no
			 */
			else
				p = p.right;
		}
		// caso chave nao foi achada, retorna null
		return null;
	}

E para procurar por String

public BSTNode search(String nome) {
		return search(root, nome);
	}

	private BSTNode search(BSTNode p, String el) {
		while (p != null) {
			/* se valor procurado == chave do no retorna referencia ao no */
			if (el.equalsIgnoreCase(p.key.getNome()))
				return p;
			/*
			 * se valor procurado < chave do no, procurar na sub-arvore esquerda
			 * deste no
			 */
			else if (el.compareToIgnoreCase(p.key.getNome()) < 0)
				p = p.left;
			/*
			 * se valor procurado > chave do no, procurar na sub-arvore direita
			 * deste no
			 */
			else
				p = p.right;
		}
		// caso chave nao foi achada, retorna null
		return null;
	}

Coloque seu codigo assim: [code] seu codigo [/code] só retire os *

Foi malz tinha passado o método errado, mais esse funciona, mais depende do BSTNode que você tem.

H

Bom, não sei se você percebeu, não entendo muito disso. Crie uma árvore de dados, mas só falta esse dois casos para finalizar. Peguei o seu código, mas não rodou não. Eu pensei em fazer assim:

void searchsTree ( TreeNode* rNodePtr ) // void, porque ela não vai retornar nada, mas pensei em retornar um inteiro. Poderia cmeçar com int.

{

if ( rNodePtr == 0 ) // A árvore não está vazia

cout << “\n A Arvore esta vazia !!!\n”;

return;
int d; // crie uma variável
    int i = 0; // crie outra variável, para ser usada como contador
    
    else( rNodePtr == d ) // se raiz for igual ao  
    {

        return cout << "\n O elemento exite";
        

        else if ( rNodePtr < d ) se raiz for menor
        searchsTree ( rNodePtr -> getLeftPtr() ); // eu chamo a função que crie  no inicío da função, antes da função main.
        i++;
        
        else if ( rNodePtr > d ) se raiz for menor
        searchsTree ( rNodePtr -> getRightPtr() );
        i++;
        }
        }

        O rNodePtr é a raiz, getLeftPtr, faz a raiz percorrer para o lado esquerdo e getRightPtr faz ela percorrer para o lado direito.
A

Uma boa dica com arvores binarias é a recursividade, ou seja, o método chamando a si proprio, então deve-se pensar em casos basicos, ou seja, quando o nó que tu procura é o teu elemento, quando o nó que tu procura é maior que o elemento passado, ou quando o nó que tu procura é menor que o elemento passado.
Como se trata de recursividade não seria muito util neste caso criar variaveis no escopo do método uma vez que quando o programa chamar a si mesmo as variaveis voltam a ter o valor definido antes.
Crie um método que funcione com as variaveis que você vai precisar, pois, toda vez que chamar o método, podera passar as variaveis no seu estado atual para o proxima chamada.
No caso do seu método:

public void searchsTree ( TreeNode rNodePtr ) { // você precisa passar como parametro algo a ser pesquisado
// precisa retornar algo, ja que é uma busca, retornar o  onde se encontra a informação é util

if ( rNodePtr == 0 ) // Este caso sera inutil, um  nunca é 0, ele pode ser null, ou conter algo, então deveria ser feito rNodePtr.getData() == 0, por exemplo 
cout << "\n A Arvore esta vazia !!!\n"; // a variavel cout não aparece no método, ela não existe.
return; // aqui retornaria o teu  por exemplo

}

Coloque o código entre as tags, facilite o entendimento.

Depois fala aê se tu conseguiu resolver…

H

Não funcionou não. Dão uns erros aqui meio doídos. Sinto que falta algo, mas não sei o que é.

H

Allan Barcelos:
Uma boa dica com arvores binarias é a recursividade, ou seja, o método chamando a si proprio, então deve-se pensar em casos basicos, ou seja, quando o nó que tu procura é o teu elemento, quando o nó que tu procura é maior que o elemento passado, ou quando o nó que tu procura é menor que o elemento passado.
Como se trata de recursividade não seria muito util neste caso criar variaveis no escopo do método uma vez que quando o programa chamar a si mesmo as variaveis voltam a ter o valor definido antes.
Crie um método que funcione com as variaveis que você vai precisar, pois, toda vez que chamar o método, podera passar as variaveis no seu estado atual para o proxima chamada.
No caso do seu método:

public void searchsTree ( TreeNode rNodePtr ) { // você precisa passar como parametro algo a ser pesquisado
// precisa retornar algo, ja que é uma busca, retornar o  onde se encontra a informação é util

if ( rNodePtr == 0 ) // Este caso sera inutil, um  nunca é 0, ele pode ser null, ou conter algo, então deveria ser feito rNodePtr.getData() == 0, por exemplo 
cout << "\n A Arvore esta vazia !!!\n"; // a variavel cout não aparece no método, ela não existe.
return; // aqui retornaria o teu  por exemplo

}

Coloque o código entre as tags, facilite o entendimento.

Depois fala aê se tu conseguiu resolver…

Eu coloco esse código aí em cima?

A

Ta cara vo te passa o método pronto.
Para String:

public BSTNode search(String el) {
		return search(root, el);
	}

	private BSTNode search(BSTNode p, String el) {
		if (p == null || el.equalsIgnoreCase(p.key.getNome()))
			return p;
		else if (el.compareToIgnoreCase(p.key.getNome()) < 0)
			return search(p.left, el);
		else
			return search(p.right, el);
	}

Para int:

public BSTNode search(int el) {
		return search(root, el);
	}

	private BSTNode search(BSTNode p, int el) {
		if (p == null || el == p.key.getNome())
			return p;
		else if (el  < p.key.getNome()))
			return search(p.left, el);
		else
			return search(p.right, el);
	}

Tenta esses.

H

Allan Barcelos:
Ta cara vo te passa o método pronto.
Para String:

public BSTNode search(String el) {
		return search(root, el);
	}

	private BSTNode search(BSTNode p, String el) {
		if (p == null || el.equalsIgnoreCase(p.key.getNome()))
			return p;
		else if (el.compareToIgnoreCase(p.key.getNome()) < 0)
			return search(p.left, el);
		else
			return search(p.right, el);
	}

Para int:

public BSTNode search(int el) {
		return search(root, el);
	}

	private BSTNode search(BSTNode p, int el) {
		if (p == null || el == p.key.getNome())
			return p;
		else if (el  < p.key.getNome()))
			return search(p.left, el);
		else
			return search(p.right, el);
	}

Tenta esses.

São várias classes novas? Eu tenho que criar cada uma?

A

Tu esta estudando BST (Arvores Binarias) ?

H

Sim. Mas a professora não usa esse termo. BST.

A

cara vo te passar as classes BST (Arvore Binaria) e BSTNode (nós da arvore binaria) para inteiros:

BSTNode:

public class BSTNode {
    protected int key;
    protected BSTNode left, right;
    
    public BSTNode() {
        left = right = null;
    }
    public BSTNode(int num) {
        this(num,null,null);
    }
    public BSTNode(int num, BSTNode lt, BSTNode rt) {
        this.key = num; left = lt; right = rt;
    }
	public int getKey() {
		return key;
	}
	public void setKey(int key) {
		this.key = key;
	}
	public BSTNode getLeft() {
		return left;
	}
	public void setLeft(BSTNode left) {
		this.left = left;
	}
	public BSTNode getRight() {
		return right;
	}
	public void setRight(BSTNode right) {
		this.right = right;
	}    
 
}

BST:

public class BST {
	private BSTNode root = null;

	public BST() {
	}

	public void clear() {
		root = null;
	}

	public boolean isEmpty() {
		return root == null;
	}

	public BSTNode getRootNode() {
		return root;
	}

	public boolean insert(int el) {
		BSTNode p = root, prev = null;
		// caso o valor ja exista na arvore, nao inserir e retornar false
		if (search(el) != null)
			return false;
		// procurando um lugar para colocar o novo noh
		while (p != null) {
			prev = p;
			if (el < p.key)
				p = p.left;
			else
				p = p.right;

		}
		// se arvore vazia
		if (root == null)
			root = new BSTNode(el);
		else if (prev.key < el)
			prev.right = new BSTNode(el);
		else
			prev.left = new BSTNode(el);
		return true;
	}

	
	public void insereArray(int[] array){
		for(int i = 0; i < array.length; i++){
			this.insert(array[i]);
		}
	}
	
	public int obtemMaior(){
		return retornaMaior(root, Integer.MIN_VALUE);
	}
	private int retornaMaior(BSTNode p, int num){
		
		if(p == null)
			return num;
		
		if(p != null){
			if(p.getKey() > num)
				num = p.getKey();
			else
				return num;
		}
		return retornaMaior(p.getRight(), num);
		
	}
	public int obtemMenor(){
		return retornaMenor(root, Integer.MAX_VALUE);
	}
	private int retornaMenor(BSTNode p, int num){
		
		if(p == null)
			return num;
		
		if(p != null){
			if(p.getKey() < num)
				num = p.getKey();
			else
				return num;
		}
		return retornaMenor(p.getLeft(), num);
		
	}
	
	public boolean isCheia(){
		int nivel = this.altura(root);
		int valor = (int) (Math.pow(2, nivel) - 1);
		
		if(contaNos() == valor)
			return true;
		else
			return false;
	}
	
	public BSTNode search(int el) {
		return search(root, el);
	}

	private BSTNode search(BSTNode p, int el) {
		while (p != null) {
			/* se valor procurado == chave do noh retorna referencia ao noh */
			if (el == p.key)
				return p;
			/*
			 * se valor procurado < chave do noh, procurar na sub-arvore esquerda
			 * deste noh
			 */
			else if (el < p.key)
				p = p.left;
			/*
			 * se valor procurado > chave do noh, procurar na sub-arvore direita
			 * deste noh
			 */
			else
				p = p.right;
		}
		// caso chave nao foi achada, retorna null
		return null;
	}

	public BSTNode searchR(int el) {
		return searchR(root, el);
	}

	private BSTNode searchR(BSTNode p, int el) {
		if (p == null || el == p.key)
			return p;
		else if (el < p.key)
			return searchR(p.left, el);
		else
			return searchR(p.right, el);
	}

	protected BSTNode searchFather(int el) {
		BSTNode p = root;
		BSTNode prev = null;
		while (p != null && !(p.key == el)) { // acha o noh p com a chave el
			prev = p;
			if (p.key < el)
				p = p.right;
			else
				p = p.left;
		}
		if (p != null && p.key == el)
			return prev;
		return null;
	}

	public void deleteByCopying(int el) {
		BSTNode node, father = null;
		node = search(el); // procura noh a ser deletado
		if (node != null && node.key == el) {
			if (node != root)
				father = searchFather(el); // procura pai do noh a ser deletado
			if (node.right == null) { // noh nao tem filho direito (caso 2);
				if (node == root)
					root = node.left;
				else if (father.left == node)
					father.left = node.left;
				else
					father.right = node.left;
			} else if (node.left == null) { // noh nao tem filho esquerdo (caso
				// 2)
				if (node == root)
					root = node.right;
				else if (father.left == node)
					father.left = node.right;
				else
					father.right = node.right;
			} else { // noh tem ambos os filhos: fazer remocao por copia
				BSTNode tmp = node.left; // 1. pegando sub-arvore esquerda
				while (tmp.right != null) { // 2. acha a posicao mais a direita
					tmp = tmp.right; // da sub-arvore esquerda do noh
				}
				deleteByCopying(tmp.key); // remove por copia o noh que possui
				// o maior valor
				// da sub-arvore esquerda do noh a ser deletado
				node.key = tmp.key; // copia o valor da chave do maior noh
				// da sub-arvore esquerda
			}
		} else if (root != null)
			System.out.println("el " + el + " is not in the tree");
		else
			System.out.println("the tree is empty");
	}

	public void deleteByMerging(int el) {
		BSTNode tmp, node, father = null;
		node = search(el); // procura noh a ser deletado
		if (node != null && node.key == el) {
			if (node != root)
				father = searchFather(el); // procura pai do noh a ser deletado
			if (node.right == null) { // noh nao tem filho direito (caso 2);
				if (root == node)
					root = node.left;
				else if (father.left == node)
					father.left = node.left;
				else
					father.right = node.left;
			} else if (node.left == null) { // noh nao tem filho esquerdo (caso
				// 2)
				if (root == node)
					root = node.right;
				else if (father.left == node)
					father.left = node.right;
				else
					father.right = node.right;
			} else { // se tem dois filhos, faz delecao por fusao
				tmp = node.left; // pega sub-arvore esquerda
				while (tmp.right != null)
					// pega filho mais a direita da sub-arvore esquerda
					tmp = tmp.right;
				tmp.right = node.right; // o filho mais a direita da sub-arvore
				// esquerda passa a ter
				// como filho direito o filho direito do noh a ser deletado
				if (root == node)
					root = node.left;
				else if (father.left == node)
					father.left = node.left;
				else
					father.right = node.left;
			}
		} else if (root != null)
			System.out.println("el " + el + " is not in the tree");
		else
			System.out.println("the tree is empty");
	}

	public int contaNos() {
		int cont = 0;
		cont = contaNos(root, cont);
		return cont;
	}

	private int contaNos(BSTNode p, int cont) {
		if (p != null) {
			cont++;
			cont = contaNos(p.left, cont);
			cont = contaNos(p.right, cont);
		}
		return cont;
	}
        
        public int qtFolha() {
		return contaFolha(root);
	}

	private int contaFolha(BSTNode p) {
		if (p == null)
			return 0;
		else if(p != null)
			if(p.getLeft() == null && p.getRight() == null)
				return 1;

			return contaFolha(p.left) + contaFolha(p.right);
	}
        
	public int altura() {
		return altura(root);
	}

	private int altura(BSTNode p) {
		if (p == null)
			return 0;
		return max(altura(p.left), altura(p.right)) + 1;
	}
        
        private int max(int i, int j) {
		return i > j ? i : j;
	}
        
        public void inorder() {
		inorder(root);
	}

	private void inorder(BSTNode p) {
		if (p != null) {
			inorder(p.left);
			System.out.print(p.key + " ");
			inorder(p.right);
		}
	}

	public void preorder() {
		preorder(root);
	}

	private void preorder(BSTNode p) {
		if (p != null) {
			System.out.print(p.key + " ");
			preorder(p.left);
			preorder(p.right);
		}
	}

	public void postorder() {
		postorder(root);
	}

	private void postorder(BSTNode p) {
		if (p != null) {
			postorder(p.left);
			postorder(p.right);
			System.out.print(p.key + " - ");
		}
	}

	protected void percursoEmLargura() throws OverflowException,
			UnderflowException {
		Queue q = new Queue(100);
		if (root != null)
			q.enqueue(root.key);
		int nivelAtual = 0;
		while (!q.isEmpty()) {
			int chave = q.dequeue();
			BSTNode n = search(chave);
			if (getNivel(n) > nivelAtual) {
				System.out.println();
				nivelAtual++;
				imprimeNroEspacos(getNroEspacos(getNivel(n), altura()) / 2);
			}
			System.out.print(imprimeChar(n.key));
			imprimeNroEspacos(getNroEspacos(getNivel(n), altura()));
			if (n.left != null)
				q.enqueue(n.left.key);
			if (n.right != null)
				q.enqueue(n.right.key);
		}
                System.out.println();
        }

        public int getNivel(BSTNode n) {
		return getNivel(root, n.key, 0);
	}

	protected int getNivel(BSTNode p, int chave, int h) {
		if (p == null)
			return -1;
		else if (p.key == chave)
			return h + 1;
		else if (chave < p.key)
			return getNivel(p.left, chave, h + 1);
		else
			return getNivel(p.right, chave, h + 1);
	}
	
	public int getDescendentes(int el){
		BSTNode p = this.search(el);
		return numDescendentes(p);
	}
	private int numDescendentes(BSTNode p){
		
		if(p != root)
		return this.contaNos(p, -1);
		
		else
			return -1;
	}

	public String imprimeChar(int n) {
		String s = "";
		if (n / 100 > 0)
			s = n + "";
		else if (n / 10 > 0)
			s = " " + n;
		else
			s = " " + n + " ";
		return s;

	}

	public int getNroEspacos(int nivel, int h) {
		int nro = (getNroNosNivel(h) * 2 - getNroNosNivel(nivel))
				/ getNroNosNivel(nivel);
		return nro;
	}

        public int getNroNosNivel(int nivel) {
		double n = Math.pow(2, nivel - 1);
		return (int) n;
	}

	public void imprimeNroEspacos(int n) {
		for (int i = 1; i <= n; i++)
			System.out.print("   ");
	}

	/* metodo de autoria de Leonardo Zandona - 2006/2 */
	public void displayTree() {
		if (isEmpty()) {
			System.out.println("Arvore vazia!");
			return;
		}
		String separator = String.valueOf("  |__");
		System.out.println(this.root.key);
		displaySubTree(root.left, separator);
		displaySubTree(root.right, separator);
	}

	private void displaySubTree(BSTNode node, String separator) {

		if (node != null) {

			BSTNode father = this.searchFather(node.key);
			if (node.equals(father.left) == true) {
				System.out.println(separator + node.key + " (ESQ)");
			} else {
				System.out.println(separator + node.key + " (DIR)");
			}

			displaySubTree(node.left, "     " + separator);
			displaySubTree(node.right, "     " + separator);
		}
	}
	
	public static void main(String args[]) {
		BST b = new BST();
		b.insert(5);
		b.insert(3);
		b.insert(7);
		b.insert(6);
		b.insert(10);
		b.insert(4);		
		b.insert(2);
		System.out.println(b.obtemMaior());
		System.out.println(b.obtemMenor());
		System.out.println(b.isCheia());
	}
}
H

Sabe como faço para deletar um elemento específico?

A

Usa o método deleteByCoping(int el), onde el é o elemento que tu passa como parametro é o que tu quer excluir, ele usa o método search(int el) para achar o elemento, ou tu pode usar o método deleteByMergin(int el) que funciona da mesma maneira.

Criado 24 de junho de 2010
Ultima resposta 2 de jul. de 2010
Respostas 14
Participantes 2