Boa noite galera,
preciso de uma ajuda com um trabalho de faculdade que estou fazendo onde tenho que remover nós de uma árvore binária, porém, não sei se é o método pra imprimir ou meu método de remoção que não está funcionando corretamente. Quando removo um nó que possui filhos, aparentemente os filhos perdem a referencia com o pai do nó removido e na hora de imprimir os elementos na tela, os filhos não são exibidos. Peço que deem uma olhada e tentem me ajudar a solucionar o erro.
Desde já, obrigado !
public class ArvoreBinariaOrdenada {
//metodo main
public static void main(String[] args) {
double notas[]=new double[3];
int matricula;
String nome;
String disciplina;
String resposta;
String respostaRepeticao;
boolean continua=true;
int RemoverMatricula;
int funcao;
boolean repeteOperacao=true;
Arvore MaryJane = new Arvore();
System.out.println("EXEMPLO DE ARVORE BINARIA");
while(repeteOperacao==true){
System.out.println("Digite:");
System.out.println("1 para inserir nós na árvore");
System.out.println("2 para remover nós da árvore");
System.out.println("3 para exibir os nós da árvore em ordem crescente do número de matrícula");
funcao=SavitchIn.readLineInt();
if(funcao==1){
continua=true;
while(continua==true){
System.out.println("Digite a matricula do aluno que quer incluir na árvore");
matricula=SavitchIn.readLineInt();
System.out.println("Digite o nome do aluno que quer incluir na árvore");
nome=SavitchIn.readLineWord();
System.out.println("Digite a disciplina do aluno que quer incluir na árvore");
disciplina=SavitchIn.readLineWord();
for(int i=0;i<notas.length;i++){
System.out.println("Digite a "+(1+i)+"ª nota do aluno que quer incluir na árvore");
notas[i]=SavitchIn.readLineDouble();
}
Aluno UniBH=new Aluno(matricula,nome,disciplina,notas);//cria objetos do tipo Aluno
MaryJane.insereNo(UniBH);
resposta="";
System.out.println("Deseja incluir mais um aluno? (S/N)");
resposta=SavitchIn.readLineWord();
if(resposta.equals("s")||resposta.equals("S")){
continua=true;
}else if(resposta.equals("n")||resposta.equals("N")){
continua=false;
}
}
}
if(funcao==2){
continua=true;
while(continua==true){
System.out.println("Digite a matricula do aluno que deseja remover da árvore");
RemoverMatricula=SavitchIn.readLineInt();
MaryJane.remover(MaryJane.raiz, RemoverMatricula);
resposta="";
System.out.println("Deseja excluir mais um aluno? (S/N)");
resposta=SavitchIn.readLineWord();
if(resposta.equals("s")||resposta.equals("S")){
continua=true;
}else if(resposta.equals("n")||resposta.equals("N")){
continua=false;
}
}
}
if(funcao==3){
continua=true;
while(continua==true){
System.out.println("Em-Ordem:");
MaryJane.Imprimeemordem(MaryJane.raiz);
System.out.println("");
resposta="";
System.out.println("Deseja exibir a arvore mais uma vez? (S/N)");
resposta=SavitchIn.readLineWord();
if(resposta.equals("s")||resposta.equals("S")){
continua=true;
}else if(resposta.equals("n")||resposta.equals("N")){
continua=false;
}
}
}
System.out.println("Deseja realizar outra operacao? (S/N)");
respostaRepeticao=SavitchIn.readLineWord();
if(respostaRepeticao.equals("s")||respostaRepeticao.equals("S")){
repeteOperacao=true;
}
if(respostaRepeticao.equals("n")||respostaRepeticao.equals("N")){
repeteOperacao=false;
}
}
}
}
public class Arvore {
No raiz;
public Arvore(){
this.raiz=null;
}
public synchronized void insereNo(Aluno inserido){
if(this.raiz==null){
raiz=new No(inserido);
}
else{
raiz.inserir(raiz, inserido);
}
}
public No remover(No node, int matricula) {
System.out.println("Percorrendo No com a matricula " + node.valor.matricula);
if (node == null) {
System.out.println("Arvore vazia ");
}
if (matricula < node.valor.matricula) {
node.esquerda = remover(node.esquerda, matricula);
}
else if (matricula > node.valor.matricula) {
node.direita = remover(node.direita, matricula);
}
else if (node.esquerda != null && node.direita != null){
System.out.println("Removeu No com a matricula " + node.valor.matricula);
node.valor.matricula = node.encontraMinimo(node.direita).valor.matricula;
node.direita = node.removeMinimo(node.direita);
}
else {
System.out.println("Removeu No com a matricula " + node.valor.matricula);
node = (node.esquerda == null) ? node.esquerda : node.direita;
}
return node;
}
public void Imprimeemordem(No nodo){
if(nodo==null) return;
Imprimeemordem(nodo.esquerda);
if(nodo.valor.aprovado==true){
System.out.println("Matricula: "+nodo.valor.matricula);
System.out.println("Nome:"+nodo.valor.nome);
System.out.println("Disciplina: "+nodo.valor.disciplina);
System.out.println("Resultado: Aprovado");
}else{
System.out.println("Matricula: "+nodo.valor.matricula);
System.out.println("Nome:"+nodo.valor.nome);
System.out.println("Disciplina: "+nodo.valor.disciplina);
System.out.println("Resultado: Reprovado");
}
Imprimeemordem(nodo.direita);
}
}
//classe No com tres atributos
public class No {
No esquerda;
No direita;
Aluno valor;
public No(Aluno valor) {
this.valor = valor;
}
public void inserir(No node, Aluno valor) {
if(valor.matricula < node.valor.matricula){
if (node.esquerda != null) {
inserir(node.esquerda, valor);
}else{
System.out.println("Inserindo "+valor.matricula+" a esquerda da matricula " + node.valor.matricula);
node.esquerda = new No(valor);
}
}else if(valor.matricula > node.valor.matricula){
if (node.direita != null) {
inserir(node.direita, valor);
}else{
System.out.println("Inserindo "+valor.matricula+" a direita da matricula " + node.valor.matricula);
node.direita = new No(valor);
}
}
}
public No removeMinimo(No node) {
if (node == null) {
System.out.println("ERRO");
} else if (node.esquerda != null) {
node.esquerda = removeMinimo(node.esquerda);
return node;
} else {
return node.direita;
}
return null;
}
public No encontraMinimo(No node) {
if (node != null) {
while (node.esquerda != null) {
node = node.esquerda;
}
}
return node;
}
}
//classe Aluno com cinco atributos representando os dados dos alunos
public class Aluno{
int matricula;
String nome;
String disciplina;
double notas[];
boolean aprovado;
//construtor de Aluno para atribuir os valores iniciais
public Aluno(int matriculaAluno, String nomeAluno, String disciplinaAluno, double notasAluno[]){
matricula=matriculaAluno;
nome=nomeAluno;
disciplina=disciplinaAluno;
notas=notasAluno;
aprovado=Aprovacao();
}
//metodo aprovação para saber se o aluno foi aprovado ou não na disciplina dependendo da soma das notas
public boolean Aprovacao(){
double soma=0;
for (int i=0;i<notas.length;i++){
soma+=notas[i];
}
if (soma>=70.0){
return true;
}
else{
return false;
}
}
}