Bom estou fazendo uma estrutura de dados chamada " Arvore Rubro Negra", porém logo após inserir o segundo elemento esta dando o seguinte erro: run:
Exception in thread "main" java.lang.NullPointerException
at arvore_rubro_negra.AvRN.propriedades(AvRN.java:51)
at arvore_rubro_negra.AvRN.propriedades(AvRN.java:25)
at arvore_rubro_negra.No.inserirNo(No.java:24)
at arvore_rubro_negra.AvRN.inserir(AvRN.java:19)
at arvore_rubro_negra.Arvore_Rubro_Negra.main(Arvore_Rubro_Negra.java:6)
Java Result: 1
CONSTRUÍDO COM SUCESSO (tempo total: 0 segundos)
estou postando as classes
Main
package arvore_rubro_negra;
public class Arvore_Rubro_Negra {
public static void main(String[] args) {
AvRN teste = new AvRN();
teste.inserir(34);
teste.inserir(3);
teste.inserir(50);
teste.inserir(20);
teste.inserir(15);
teste.inserir(16);
teste.inserir(25);
teste.inserir(27);
teste.preOrdem();
}
}
No[code]
package arvore_rubro_negra;
import java.awt.Color;
public class No {
public int dado;
public No esq;
public No dir;
public No pai;
public Color cor;
AvRN ver = new AvRN();
public No(int elemento) {
dado = elemento;
esq = null;
dir = null;
cor = Color.RED;
}
public void inserirNo(int elemento) {
if (elemento < dado) {
if (esq == null) {
esq = new No(elemento);// se NO da esquerda for igual a nulo insiro
ver.propriedades(elemento);
} else {
esq.inserirNo(elemento);//se NO da esquerda for diferente de nulo passo para o proximo no até que seje nulo
}
} else if (elemento > dado) {
if (dir == null) {
dir = new No(elemento);
ver.propriedades(elemento);
} else {
dir.inserirNo(elemento);
}
}
}
}[/code]
AvRN:[code]
package arvore_rubro_negra;
import java.awt.Color;
public class AvRN {
private No raiz;
public AvRN(){
raiz = null;
}
public void inserir(int elemento) {
if (raiz == null) {
raiz = new No(elemento);//se não tiver ngm na raiz insiro o elemento
raiz.cor = Color.BLACK;
}
else {
raiz.inserirNo(elemento);//Caso tenha chamo o método inserirNo da classe NoArvore
}
}
public void propriedades(int dado) {
No r = raiz;
No x = propriedades(r, dado);
No tio = tio(x);
No avo = avo(x);
if(tio.cor.equals(Color.RED)){ // caso 1
caso1(x);
}
if(tio.cor.equals(Color.BLACK)){//caso 2
if(avo.dir.dado == tio.dado){//caso 2
caso2(x);
}
if(avo.esq.dado == tio.dado){//caso 2 simetrico
caso2simetrico(x);
}
}
if(tio.cor.equals(Color.BLACK)){
if(avo.dir.dado == tio.dado){//caso 3
caso3(x);
}
if(avo.esq.dado == tio.dado){//caso 3 simetrico
caso3simetrico(x);
}
}
}
public No propriedades(No x, int dado) {
if (dado < x.dado) {
propriedades(x.esq, dado);
}
if (dado > x.dado) {
propriedades(x.dir, dado);
}
if (dado == x.dado) {
return x;
}
else {
return null;
}
}
private void RotacaoEsq(No x) {
No y = x.dir;
x.dir = y.esq;
if (y.esq != null) {
y.esq.pai = x;
}
y.pai = x.pai;
if (x.pai == null) {
raiz = y;
} else {
if (x == x.pai.esq) {
x.pai.esq = y;
} else {
x.pai.dir = y;
}
}
y.esq = x;
x.pai = y;
}
private void RotacaoDir(No y) {
No x = y.esq;
y.esq = x.dir;
if (x.dir != null) {
x.dir.pai = y;
}
x.pai = y.pai;
if (y.pai == null) {
raiz = x;
} else {
if (y == y.pai.dir) {
y.pai.dir = x;
} else {
y.pai.esq = x;
}
}
x.dir = y;
y.pai = x;
}
private No avo(No x) {
if ((x != null) && (x.pai != null)) {
return x.pai.pai;
}
else {
return null;
}
}
private No tio(No x) {
No avo = avo(x);
if (avo == null) {
return null;
}
if (x.pai == avo.esq) {
return avo.dir;
}
else {
return avo.esq;
}
}
private void caso1(No x) {
No tio = tio(x);
tio.cor = Color.BLACK;
x.pai.cor = Color.BLACK;
No avo = avo(x);
avo.cor = Color.RED;
}
private void caso2(No x) {
x = x.pai;
RotacaoEsq(x);
caso3(x.esq);
}
private void caso2simetrico(No x) {
x = x.pai;
RotacaoDir(x);
caso3simetrico(x.esq);
}
private void caso3(No x) {
x.pai.cor = Color.BLACK;
No avo = avo(x);
avo.cor = Color.BLACK;
RotacaoDir(avo);
}
private void caso3simetrico(No x) {
x.pai.cor = Color.BLACK;
No avo = avo(x);
avo.cor = Color.BLACK;
RotacaoEsq(avo);
}
public void preOrdem() {
System.out.println("PreOrdem");
preOrdemRecursivo(raiz);
}
private void preOrdemRecursivo(No no) {
if (no == null) {
return;
}
System.out.println(no.dado + " " + no.cor);
preOrdemRecursivo(no.esq);
preOrdemRecursivo(no.dir);
}
public void inOrdem() {
System.out.println("InOrdem");
inOrdemRecursivo(raiz);
}
private void inOrdemRecursivo(No no) {
if (no == null) {
return;
}
inOrdemRecursivo(no.esq);
System.out.println(no.dado + " ");
inOrdemRecursivo(no.dir);
}
public void posOrdem() {
System.out.println("PosOrdem");
posOrdemRecursivo(raiz);
}
private void posOrdemRecursivo(No no) {
if (no == null) {
return;
}
posOrdemRecursivo(no.esq);
posOrdemRecursivo(no.dir);
System.out.println(no.dado + " ");
}
}
[/code]
alguem pode me ajudar?