Dúvida Árvore binaria de pesquisa

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

:slight_smile: