2
I’m trying to remove a leaf from the tree, I made a code that apparently, in my head is right, only it doesn’t remove the element I want.
Here is my class No
:
package arvore;
public class No {
private No esquerda;
private No direita;
private int valor;
public No(int valor) {
this.valor = valor;
}
public No getEsquerda() {
return esquerda;
}
public void setEsquerda(No esquerda) {
this.esquerda = esquerda;
}
public No getDireita() {
return direita;
}
public void setDireita(No direita) {
this.direita = direita;
}
public int getValor() {
return valor;
}
public void setValor(int valor) {
this.valor = valor;
}
}
Here is my class ArvoreBinaria
:
package arvore;
public class ArvoreBinaria {
private No raiz;
public ArvoreBinaria(int valor) {
adicionar(raiz, valor);
}
public No getRaiz() {
return raiz;
}
public void setRaiz(No raiz) {
this.raiz = raiz;
}
public void adicionar(int valor) {
adicionar(raiz, valor);
}
public void adicionar(No no, int valor) {
if (this.raiz == null) {
raiz = new No(valor);
return;
}
if (valor < no.getValor()) {
if (no.getEsquerda() != null) {
adicionar(no.getEsquerda(), valor);
} else {
no.setEsquerda(new No(valor));
}
} else if (valor >= no.getValor()) {
if (no.getDireita() != null) {
adicionar(no.getDireita(), valor);
} else {
no.setDireita(new No(valor));
}
}
}
public void preOrdem() {
preOrdem(this.raiz);
}
public void preOrdem(No no) {
if (no != null) {
System.out.println(no.getValor());
preOrdem(no.getEsquerda());
preOrdem(no.getDireita());
}
}
public void posOrdem() {
posOrdem(this.raiz);
}
public void posOrdem(No no) {
if (no != null) {
posOrdem(no.getEsquerda());
posOrdem(no.getDireita());
System.out.println(no.getValor());
}
}
public void emOrdem() {
emOrdem(this.raiz);
}
public void emOrdem(No no) {
if (no != null) {
emOrdem(no.getEsquerda());
System.out.println(no.getValor());
emOrdem(no.getDireita());
}
}
public void remover(int valor) {
remover(this.raiz, valor);
}
public void remover(No no, int valor) {
if (no != null) {
boolean flag = false;
if (valor == no.getValor() && no.getEsquerda() == null && no.getDireita() == null) {
no = null;
flag = true;
}
if (!flag) {
remover(no.getEsquerda(), valor);
remover(no.getDireita(), valor);
}
if (flag == false) {
if (no.getEsquerda() == null) {
no.setEsquerda(null);
}
if (no.getDireita() == null) {
no.setDireita(null);
}
}
}
}
}
Here is my main application:
package app;
import arvore.ArvoreBinaria;
public class App {
public static void main(String[] args) {
ArvoreBinaria arvore = new ArvoreBinaria(10);
arvore.adicionar(8);// 10
arvore.adicionar(12);// 8 12
arvore.adicionar(12);// 6 9 11 12
arvore.adicionar(11);// n 7 n n n 11 n 15
arvore.adicionar(11);// n n n n n n
arvore.adicionar(15);//
arvore.adicionar(9);// n = null
arvore.adicionar(6);//
arvore.adicionar(7);//
//System.out.println(arvore.getRaiz().getDireita().getEsquerda().getDireita().getValor());
/*System.out.println("Pré Ordem");
arvore.preOrdem();
System.out.println("----------------------------");
System.out.println("Em Ordem");
arvore.emOrdem();
System.out.println("----------------------------");
System.out.println("Pós Ordem");
arvore.posOrdem();
*/
arvore.remover(7);
//System.out.println(arvore.getRaiz().getEsquerda().getEsquerda().getDireita().getValor());
arvore.emOrdem();
}
}
if (!flag)
andif (flag == false)
are the same thing.– Augusto Vasques
Yes, it is that in the first flag if it is true, I do not want it to enter that block of code, because it would give Nullpointerexception, since the no.getEsquerda() would be exactly of the sheet, of the node I just annulled. Already in the second flag, it only becomes true when it finds the sheet, when not, it remains false. then I made that code block for the in the parent, override the reference to the node that was just removed, when the recursive execution stack goes back to the parent.
– Gabriel Henrique
You do not have any code that can modify the value of this flag between the two comparisons.
– Augusto Vasques