Boa noite, gostaria d pedir ajuda a vocês pq já não tenho idéia do q pode estar errado. Uma amiga minha fez um trabalho sobre árvores na faculdade (calma, não vim pedir uma classe java pronta pra entregar), mas como estava dando um erro ela pediu pra eu debugar e procurar.
Debuguei o maximo q eu pude mas não consegui entender o pq do erro.
O erro é o seguinte (no fim do tópico coloco os códigos): eu crio a árvore, insiro o primeiro nó da raiz (até aki td bem), qdo vou inserir um segundo nó (tanto eskerdo como direito) a inserção ocorre sem erro mas o valor não vai parar no filho da raiz. É como se eu não tivesse colocado o novo nó no filho da raiz.
Agradeço mto a ajuda e me desculpo pelo estado do código, eu mexi em mta coisa pra testar e não voltei ao normal
package br.com.analg.model;
public class Aluno {
private int RA;
private String nome;
private double notaPrimeiroSemestre;
private double notaSegundoSemestre;
public Aluno(){
RA = 0;
nome = "";
notaPrimeiroSemestre = 0.0;
notaSegundoSemestre = 0.0;
}
public Aluno(int RA, String nome, double nota1, double nota2){
this.RA = RA;
this.nome = nome;
notaPrimeiroSemestre = nota1;
notaSegundoSemestre = nota2;
}
public int getRA(){
return RA;
}
public void setRA(int RA){
this.RA = RA;
}
public String getNome(){
return nome;
}
public void setNome(String nome){
this.nome = nome;
}
public double getNotaPrimeiroSemestre(){
return notaPrimeiroSemestre;
}
public void setNotaPrimeiroSemestre(double nota){
notaPrimeiroSemestre = nota;
}
public double getNotaSegundoSemestre(){
return notaSegundoSemestre;
}
public void setNotaSegundoSemestre(double nota){
notaSegundoSemestre = nota;
}
public String toString(){
return "" + RA;
}
}
package br.com.analg.model;
public class Node extends Object{
private Object elemento;
public Node leftChild;
public Node rightChild;
public Node(Aluno aluno){
elemento = aluno;
leftChild = null;
rightChild = null;
}
public Object getElemento(){
return elemento;
}
public void setElemento(Object o){
elemento = o;
}
public Node getLeftChild(){
return leftChild;
}
public void setLeftChild(Node n){
leftChild = n;
}
public Node getRightChild(){
return rightChild;
}
public void setRightChild(Node n){
rightChild = n;
}
public boolean hasLeftChild(){
if(leftChild == null){
return false;
} else {
return true;
}
}
public boolean hasRightChild(){
if(rightChild == null){
return false;
} else {
return true;
}
}
}
package br.com.analg.model;
import javax.swing.*;
public class ArvoreBinaria {
public Node raiz;
public ArvoreBinaria(){
raiz = null;
}
public Node getRaiz(){
return raiz;
}
public String Inserir(Aluno aluno){
if(raiz == null){
raiz = new Node(aluno);
return "Aluno inserido com sucesso";
} else {
return Inserir(raiz, aluno);
}
}
public String Inserir(Node no, Aluno aluno){
if(no == null){
JOptionPane.showMessageDialog(null, "nulo", "Retorno da Inserção", 1);
no = new Node(aluno);
return "Aluno inserido com sucesso " + no.getElemento().toString();
} else {
JOptionPane.showMessageDialog(null, "não nulo" + ((Aluno)no.getElemento()).toString(), "Retorno da Inserção", 1);
if(aluno.getRA() < ((Aluno)no.getElemento()).getRA()){
JOptionPane.showMessageDialog(null, "eskerda", "Retorno da Inserção", 1);
return "1 eskerda " + Inserir(no.getLeftChild(), aluno);
} else if(aluno.getRA() > ((Aluno)no.getElemento()).getRA()){
JOptionPane.showMessageDialog(null, "direita", "Retorno da Inserção", 1);
return "1 direita " + Inserir(no.getRightChild(), aluno);
} else {
return "Aluno já existe";
}
}
}
public Aluno Buscar(Node no, int ra){
if(no == null){
return null;
} else {
if(((Aluno) no.getElemento()).getRA() == ra){
return (Aluno)no.getElemento();
} else if(ra < ((Aluno) no.getElemento()).getRA()){
JOptionPane.showMessageDialog(null, "eskerda", "Retorno da Inserção", 1);
return Buscar(no.leftChild, ra);
} else {
JOptionPane.showMessageDialog(null, "direita", "Retorno da Inserção", 1);
return Buscar(no.rightChild, ra);
}
}
}
public Aluno Remover(Node no, int ra){
Node p, q;
if(no == null){
return null;
} else {
if(ra < ((Aluno) no.getElemento()).getRA()){
return Remover(no.leftChild, ra);
} else if(ra > ((Aluno) no.getElemento()).getRA()){
return Remover(no.rightChild, ra);
} else {
if(!no.hasLeftChild() && !no.hasRightChild()){
Aluno ret = (Aluno)no.getElemento();
no = null;
return ret;
} else if(no.hasLeftChild() && !no.hasRightChild()){
Aluno ret = (Aluno)no.getElemento();
no = no.leftChild;
return ret;
} else if(!no.hasLeftChild() && no.hasRightChild()){
Aluno ret = (Aluno)no.getElemento();
no = no.rightChild;
return ret;
} else {
Aluno ret = (Aluno)no.getElemento();
p = no.leftChild;
q = null;
while(p.hasRightChild()){
q = p;
p = p.rightChild;
}
if(q == null){
no.setLeftChild(p.leftChild);
no.setElemento(p.getElemento());
p = null;
} else {
q.setRightChild(p.leftChild);
no.setElemento(p.getElemento());
p = null;
}
return ret;
}
}
}
}
public static void main(String args[]){
ArvoreBinaria arvore = new ArvoreBinaria();
Aluno novo = new Aluno(16, "a", 1, 5);
String res = arvore.Inserir(arvore.raiz, novo);
JOptionPane.showMessageDialog(null, res, "Retorno da Inserção", 1);
novo = new Aluno(24, "b", 6, 2);
res = arvore.Inserir(arvore.raiz, novo);
JOptionPane.showMessageDialog(null, res, "Retorno da Inserção", 1);
//JOptionPane.showMessageDialog(null, ((Aluno)arvore.raiz.rightChild.getElemento()).toString(), "Retorno da Inserção", 1);
novo = new Aluno(30, "c", 8, 2);
res = arvore.Inserir(arvore.raiz, novo);
JOptionPane.showMessageDialog(null, res, "Retorno da Inserção", 1);
}
}
package br.com.analg;
import br.com.analg.model.ArvoreBinaria;
import br.com.analg.model.Aluno;
import javax.swing.*;
public class TestaArvore {
public static void main(String args[]){
ArvoreBinaria arvore = new ArvoreBinaria();
Aluno novo = new Aluno(16, "a", 1, 5);
String res = arvore.Inserir(novo);
JOptionPane.showMessageDialog(null, res, "Retorno da Inserção", 1);
novo = new Aluno(24, "b", 6, 2);
res = arvore.Inserir(novo);
JOptionPane.showMessageDialog(null, res, "Retorno da Inserção", 1);
//JOptionPane.showMessageDialog(null, ((Aluno)arvore.raiz.rightChild.getElemento()).toString(), "Retorno da Inserção", 1);
novo = new Aluno(30, "c", 8, 2);
res = arvore.Inserir(novo);
JOptionPane.showMessageDialog(null, res, "Retorno da Inserção", 1);
int ra = Integer.parseInt(JOptionPane.showInputDialog("Digite o RA para busca"));
Aluno busca = arvore.Buscar(arvore.raiz, ra);
if(busca == null){
JOptionPane.showMessageDialog(null, "Não Houve Retorno", "Retorno da Busca", 1);
} else {
JOptionPane.showMessageDialog(null, "RA: " + busca.getRA() + "\nNome: " + busca.getNome() + "\nPrimeiro Semestre: " + busca.getNotaPrimeiroSemestre() + "\nSegundo Semestre: " + busca.getNotaSegundoSemestre(), "Retorno da Busca", 1);
}
ra = Integer.parseInt(JOptionPane.showInputDialog("Digite o RA para exclusão"));
Aluno remocao = arvore.Remover(arvore.raiz, ra);
if(remocao == null){
JOptionPane.showMessageDialog(null, "Não Houve Retorno", "Retorno da Busca", 1);
} else {
JOptionPane.showMessageDialog(null, "RA: " + remocao.getRA() + "\nNome: " + remocao.getNome() + "\nPrimeiro Semestre: " + remocao.getNotaPrimeiroSemestre() + "\nSegundo Semestre: " + remocao.getNotaSegundoSemestre(), "Item Excluído", 1);
}
}
}