Olá, pessoal estou com o seguinte problema quando crio instancias em de uma classe em tempo de execução.
Tenho um arvore binária de busca que armazena em seu nó uma matiz de pxq e tenho que criar vários nós em minhas arvore com matrizes deferentes, mas quando eu crio uma instancia de um no dentro de um for ele insere na arvore a mesma instancia da matriz n vezes. Veja abaixo como ta o código.
Código no Main
for (String string : main.listaNo) {
No no = new No();
String[][] aux = new String[contLinhaDigitoImagem][contColunaDigitoImagem];
int posicao = 0;
no.verificador = string.replace(" ", "");
String[] a = string.split(" ");
for (int i = 0; i < contLinhaDigitoImagem; i++) {
for (int j = 0; j < contColunaDigitoImagem; j++) {
aux[i][j] = a[posicao];
posicao++;
}
}
no.setMatriz(aux);
no.setContColuna(contColunaDigitoImagem);
no.setContLinha(contLinhaDigitoImagem);
arvore1.inserirUnico(no, arvore1.getRaiz());
}
Propriedades dos Nó
class No {
private int frequencia;
private No direita;
private No esquerda;
public String[][] matrix;
private int contLinha;
private int contColuna;
private String caracteres;
public String verificador;
}
Método insere da árvore binária de busca
[code] public void inserirUnico(No novo, No anterior) {
this.contNos++;
this.contFrequencia++;
this.alturaArvore++;
this.contFrequencia += (this.contNos % 2);
VerificaUnico(novo, anterior);
if (this.existe == false) {
inserir(novo, anterior);
}
this.existe = false;
}
public String mostraNo(No no) {
return no.mostraMatriz();
}
public No inserir(No novo, No anterior) {
if (this.raiz == null) {
raiz = novo;
return null;
} else {
if (anterior != null) {
if (novo.getValorString().compareTo(anterior.getValorString()) < 0)
anterior.setEsquerda(this.inserir(novo,
anterior.getEsquerda()));
else {
anterior.setDireita(this.inserir(novo,
anterior.getDireita()));
}
} else {
anterior = novo;
}
return anterior;
}
}[/code]
A linha 18 do seu Main não está errada não?
arvore1.inserirUnico(no, arvore1.getRaiz());
Você tá falando que sempre o anterior é a Raiz… o anterior não deveria ser o Nodo-pai deste novo Nodo!?
Dai no seu método insere()… você sempre monta um árvore no filho a esquerda ou a direita do anterior, que segundo o que disse acima é sempre a Raiz. (Não deveria percorrer todos os nodos pecursivamente até achar o nodo mais próximo para inserção?)
Como você não expôs os métodos da Classe No… o método getValorString() retorna o quê? Está diferente de nulo?
Eu não entendi muita coisa. Mas acho que deveria colocar o algoritmo inteiro para alguém te ajudar melhor.
Abraço.
Entao Rafael, o metodo inserir como ele é Recursivo ele percorre toda a arvore em fazendo a inserção do menor a esquerda e o maior a direita do pai, mas a duvida é que sempre quando eu executo ele aparece a mesma matriz, código da árvore esta correto ja testei varias vezes e ja ate usei em outros projetos funcionou perfeitamente. segue abaixo.
1 1
1 1
Frequência 1
Quantidade de nos da Arvore 40
A Frequencia de nos da Arvore 60
o comprimento do caminho interno 40
A altura da arvore 20
Numero de comparações 20
tempo de precessamento em nano segundos 455403200040875
O código esta muito grande não da pra colar todo, mas coloquei uma boa parte, segue abaixo.
Main
public static void main(String[] args) throws FileNotFoundException {
Main main = new Main();
ArvoreAVL arvore1 = new ArvoreAVL();
FileInputStream file = new FileInputStream("imagem.txt");
Scanner scanner = new Scanner(file);
main.carregaImagem(scanner);
for (int i = 0; i <= 1000; i++) {
Scanner digito = new Scanner(System.in);
System.out.println("Digite a quantidade de Linhas da matriz");
contLinhaDigitoImagem = digito.nextInt();
System.out.println("Digite a quantidade de Colunas da matriz");
contColunaDigitoImagem = digito.nextInt();
if (contLinhaDigitoImagem <= contLinhaArquivoImagem
|| contLinhaDigitoImagem <= contLinhaArquivoImagem) {
i = 2000;
}
}
main.separaMatriz(main.imagem);
// main.arvore.emOrdem(main.arvore.getRaiz());
String msg = "";
for (String string : main.listaNo) {
No no = new No();
String[][] aux = new String[contLinhaDigitoImagem][contColunaDigitoImagem];
int posicao = 0;
no.verificador = string.replace(" ", "");
String[] a = string.split(" ");
for (int i = 0; i < contLinhaDigitoImagem; i++) {
for (int j = 0; j < contColunaDigitoImagem; j++) {
aux[i][j] = a[posicao];
posicao++;
}
}
no.setMatriz(aux);
no.setContColuna(contColunaDigitoImagem);
no.setContLinha(contLinhaDigitoImagem);
arvore1.inserirUnico(no, arvore1.getRaiz());
}
arvore1.emOrdem(arvore1.getRaiz());
arvore1.getContNos();
arvore1.getFrequencia();
arvore1.getcompCaminhoInterno();
arvore1.getaltArvore();
arvore1.getNumeroComparacaoes();
arvore1.gettempoDeProcessamento();
}
No
class No {
private int frequencia;
private No direita;
private No esquerda;
public String[][] matrix;
private int contLinha;
private int contColuna;
private String caracteres;
public String verificador;
public String getValorString() {
String msg = "";
for (int i = 0; i < this.contLinha; i++) {
for (int j = 0; j < contColuna; j++) {
msg += this.matrix[i][j] + " ";
}
}
return msg;
}
}
Árvore binária
public void inserirUnico(No novo, No anterior) {
this.contNos++;
this.contFrequencia++;
this.alturaArvore++;
this.contFrequencia += (this.contNos % 2);
VerificaUnico(novo, anterior);
if (this.existe == false) {
inserir(novo, anterior);
}
this.existe = false;
}
public No inserir(No novo, No anterior) {
if (this.raiz == null) {
raiz = novo;
return null;
} else {
if (anterior != null) {
if (novo.getValorString().compareTo(anterior.getValorString()) < 0)
anterior.setEsquerda(this.inserir(novo,
anterior.getEsquerda()));
else {
anterior.setDireita(this.inserir(novo,
anterior.getDireita()));
}
} else {
anterior = novo;
}
return anterior;
}
}
public void VerificaUnico(No novo, No anterior) {
if (anterior != null) {
boolean a = novo.matrix.equals(anterior.matrix);
if (a) {
anterior.setFrequencia(anterior.getFrequencia() + 1);
this.existe = true;
}
VerificaUnico(novo, anterior.getEsquerda());
VerificaUnico(novo, anterior.getDireita());
}
public void emOrdem(No no) {
if (no != null) {
this.compCaminhoint++;
emOrdem(no.getEsquerda());
System.out.println(no.mostraMatriz() + "Frequência "
+ no.getFrequencia());
emOrdem(no.getDireita());
}
}
Entendi… mas…
Mesma matrix? o quê é a matriz? É um atributo da Classe No? public String[][] matrix;
O quê tem em: main.listaNo?
matrix é uma propriedade da classe No que contem a matriz que será inserida na Árvore binária e justamente na transição da martiz do Main para a matriz do No que o valor é mudado não sei
como e o método VerificaUnico da Árvore binária fala que já existe este no e manda somar mais 1 na frequência ao invés de inserir na esquerda ou na direita. O main.listaNo é uma ArrayList com
varias Strings que viram a matriz que vai no No tem um for each que percorre esta ArrayList e faz isso.
Mas onde é instânciado e populado no main.listaNo?
main.separaMatriz(main.imagem);
Isso altera main.listaNo?
for (String string : main.listaNo)
Pelo que notei… sua árvore será construida de acordo com o conteúdo de main.listaNo… Dependendo da sua resposta da duas primeiras perguntas. Esse valor é sempre o mesmo? Pois se for a arvore sempra vai ser a mesma.
A profundidade da arvore é ditada também por: contLinhaDigitoImagem e contColunaDigitoImagem?
Qual é a situação deles?
O main.listaNo é uma ArrayList<String[]> de vetores String o separaMatriz() é uma função que paga uma matriz enorme por exemplo 50x50 e quebra em matrizes menores(essa função foi testada varias vezes ate em outros projetos e esta funcionando perfeitamente), onde o usuário vai digitar tamanho da matriz auxiliar no contLinhaDigitoImagem e contColunaDigitoImagem. Essas duas variáveis não tem relação direta com a classe Árvore Binária e sim com a Classe No, e a main.listaNo e populada na função separaMatriz() e não tem dados repetidos eu ja verifiquei isso.
Desde já agradeço.
Ou seja… toda vez que o programa é executado main.listaNo contém valores diferentes a vez anterior.
Se o isso… a arvore não seria a mesma… mesmo se os valores fossem o mesmo só com posições trocadas.
Esse comportamento que você comenta deve só o ocorrer no caso de main.listaNo fosse populado com o mesmo valor. Mas como você garante que não… não faz sentido.
Mas só de olhar complica…
Tente imprimir sua arvore e veja se tem os elementos da sua matriz de inserção.
Beleza, ja resolvi meu problema usando outra Array List na arvore binaria, é um trabalho da faculdade eu ja entreguei mais queria saber pq a instancia da matriz na classe No muda seu valor desta forma estranha, mas obrigado pela ajuda
