NullPointerException

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?

Nossa cara, esse seu código tá feio. Desculpe o comentário, mas tá totalmente fora das boas práticas…

Primeiro que você está acessando as variáveis da outra classe diretamente, quando o correto é acessar através de métodos.

Segundo que na linha 51 da segunda classe que você postou é que o erro está ocorrendo, o próprio código de erro acusou isso. De algum modo você está passando esse parâmetro do tipo No do método propriedades como nulo, e está ocasionando esse erro…

Não entendi direito que você pretende fazer com estas classes, mas te aconselho a estudar um pouco mais o paradigma OO, regras de codificação em Java e encapsular mais essas suas classes.

Tá todo mundo vendo todo mundo, meio bagunçado isso aí…

:wink:

Onde está o método main ?

Análise na diagonal, mas parecem faltar dois return: linha 52 e linha 55 de AvRN

na verdade não esta faltando return nessas linhas por serem recursivos…

[quote]Nossa cara, esse seu código tá feio. Desculpe o comentário, mas tá totalmente fora das boas práticas…

Primeiro que você está acessando as variáveis da outra classe diretamente, quando o correto é acessar através de métodos.

Segundo que na linha 51 da segunda classe que você postou é que o erro está ocorrendo, o próprio código de erro acusou isso. De algum modo você está passando esse parâmetro do tipo No do método propriedades como nulo, e está ocasionando esse erro…

Não entendi direito que você pretende fazer com estas classes, mas te aconselho a estudar um pouco mais o paradigma OO, regras de codificação em Java e encapsular mais essas suas classes.

Tá todo mundo vendo todo mundo, meio bagunçado isso aí…

[/quote]

pra fala a verdade não entendi o que você quiz dizer pois a unica coisa que eu fuiz na classe No foi esse:

AvRN ver = new AvRN();

para que quando eu insira 1 elemento ele verifique se sai das propriedades de uma arvore rubro negra.

e sim quando ele entra no metodo :

public void propriedades(int dado)

por alguma razao a raiz da arvore esta nula quando não deveria estar

estou editando o primeiro topico e colocando ele pois quando postei não achei necessario.

[quote=l1511s]na verdade não esta faltando return nessas linhas por serem recursivos…
[/quote]
Por isso mesmo é que falta. Senão o que vai ser devolvido é null.

por alguma razao a raiz da arvore esta nula quando não deveria estar

Estou analisando seu codigo, mas adianto algo:

No construto AvRN voce seta a variavel raiz como NULL, logo, quando ela for chamada no metodo propriedades sempre vai cair na exception, a nao ser que voce trate essa excecao.

Mais informacoes postarei aqui.

Faz esse teste:

  1. Delete o construtor da classe AvRN.
  2. Coloque os codigos dos metodos: public void propriedades(int dado) e public No propriedades(No x, int dado) dentro de blocos try/catch, tratando a excecao NullPointerException, mas sem colocar nenhum parametro dentro do catch. Dessa forma consegui obter a saida do programa logo abaixo.

PreOrdem
34 java.awt.Color[r=0,g=0,b=0]
3 java.awt.Color[r=255,g=0,b=0]
20 java.awt.Color[r=255,g=0,b=0]
15 java.awt.Color[r=255,g=0,b=0]
16 java.awt.Color[r=255,g=0,b=0]
25 java.awt.Color[r=255,g=0,b=0]
27 java.awt.Color[r=255,g=0,b=0]
50 java.awt.Color[r=255,g=0,b=0]

veja esse código:

AvRN ver = new AvRN();

no construtor:
public AvRN(){
raiz = null;
}

ou seja, ver.raiz == null. certo?

ver.raiz só deixaria de ser null qdo chamasse:
ver.inseri(elemento)

q nunca foi chamado.

continuando…

o q o ver.raiz tem a ver?

} else if (elemento > dado) { if (dir == null) { dir = new No(elemento); ver.propriedades(elemento); ////aki vc chamou } else { dir.inserirNo(elemento); } }

q iria chamar:

public void propriedades(int dado) { No r = raiz; //olha o raiz aki q é null ainda No x = propriedades(r, dado);

Bom é isso mesmo que está acontecendo porém eu estou Akihito pensando em implementar os códigos propriedade na mesma hora quando eu inserir assim que eu adicionar um elemento amanhã vou verificar as possibilidades