Remoção em Árvore Binária

3 respostas
greg10

Ao desenvolver uma estrutura de Dados do tipo Árvore Binária, não consigo efetuar a remoção quando o nó não possui esquerda nem direita. Isso é claro, na segunda operação, na primeira funciona quando faço:

if(no_a_remover.esq == null && no_a_remover.dir == null){ Remover_Folha(no_a_remover.info); }

Se alguem souber como fazer poste

agradeço

3 Respostas

s4nchez

Você pode postar o resto da sua implementação da árvore? Pelo seu código tá difícil de identificar o problema

Phelp_s

:roll:

greg10

ta ai o metodo e seus derivados....

public static void Remove(){
		if(A!=null){
			int x = Integer.parseInt(JOptionPane.showInputDialog(null, 
			"Informe o Código do cadastro a ser removido"));

			no aux = A;			

			while(aux != null && x != aux.codigo){
				if(x < aux.codigo)
					aux = aux.esq;
				else
					aux = aux.dir;
			}

			if(aux == null)
				JOptionPane.showMessageDialog(null, "Código não localizado", 
						"Remoção", JOptionPane.ERROR_MESSAGE);
			else{

				no ant = A;
				no P = A;
				aux = A;

				while(aux != null && x != aux.codigo){
					if(x < aux.codigo){
						ant = aux;
						P = aux.esq;
						aux = aux.esq;
					}
					else{
						ant = aux;
						P = aux.dir;
						aux = aux.dir;
					}
				}

				if(aux.esq == null && aux.dir == null)				
					Remove_folha(ant, x);

				if(aux.esq != null && aux.dir == null)
					Remove_Esq(ant, P, x);

				if(aux.esq == null && aux.dir != null)
					Remove_Dir(ant, P, x);

				if(aux.esq != null && aux.dir != null){

					no maior = A.esq;
					no anterior = maior;

					while(maior.dir != null){
						anterior = maior;	
						maior = maior.dir;
					}	

					aux.codigo = maior.codigo;
					aux.Nome = maior.Nome;
					aux.CPF = maior.CPF;

					if(maior.esq == null && maior.dir == null)
						Remove_folha(aux, maior.codigo);

					else
						Remove_Esq(aux, P, maior.codigo);					
				}
				JOptionPane.showMessageDialog(null, "Cadastro Removido com sucesso!!", 
						"Remoção", JOptionPane.INFORMATION_MESSAGE);
			}
		}
		else
			JOptionPane.showMessageDialog(null, "Não existe elementos para excluir!", 
					"Exclusão", JOptionPane.ERROR_MESSAGE);
	}

aqui é o removedor de nós recursivo

public static void Remove_folha(no ant, int x){

		if(ant.esq == null && ant.dir == null)
			A = null;
		else if(ant.esq != null && x == ant.esq.codigo)
			ant.esq = null;
		else
			ant.dir = null;
	}

	/*Método que remove o nó que possui apenas
	 * informação à sua direita.
	 */
	public static void Remove_Dir(no ant, no P, int x){

		if(x > ant.codigo)
			ant.dir = P.dir;
		else
			ant.esq = P.dir;
	}

	/*Método que remove o nó que contém somente informações
	 * a sua esquerda.
	 */
	public static void Remove_Esq(no ant, no P, int x){

		if(x > ant.codigo)
			ant.dir = P.esq;
		else
			ant.esq = P.esq;
	}
Criado 10 de novembro de 2008
Ultima resposta 11 de nov. de 2008
Respostas 3
Participantes 3