Olá todos. Eu estou com 2 probleminhas (o problema maior está na lógica). Primeiro deixem-me postar meus códigos:
public class No {
No dir;
No esq;
No pai;
int valor;
int freq;
public No(int valor) {
dir = esq = pai = null;
this.valor = valor;
this.freq = 0;
}
public void Inserir(int chave, No pai2) {
if(chave < valor) {
if(esq == null) {
esq = new No(chave);
esq.pai = pai2;
}
else {
pai2 = esq;
esq.Inserir(chave, pai2);
}
}
else if( chave > valor ) {
if(dir == null) {
dir = new No(chave);
dir.pai = pai2;
}
else {
pai2 = dir;
dir.Inserir(chave, pai2);
}
}
}
}
public class Arvore {
No raiz;
int maiorfreq;
public Arvore() {
this.raiz = null;
maiorfreq = 0;
}
void InserirNo(int chave) {
if(raiz == null) {
raiz = new No(chave);
}
else {
raiz.Inserir(chave, raiz);
}
}
void Consulta(int chave) {
No raiz = this.raiz;
while( raiz.dir != null || raiz.esq != null ) {
if(raiz.valor == chave) {
raiz.freq ++;
if(raiz.freq > maiorfreq) {
maiorfreq = raiz.freq;
}
break;
}
if(raiz.valor > chave) {
if(raiz.esq != null) {
raiz = raiz.esq;
}
else {
break;
}
}
if(raiz.valor < chave) {
if(raiz.dir != null) {
raiz = raiz.dir;
}
else {
break;
}
}
}
}
void Retorna() {
while(raiz.pai != null) {
raiz = raiz.pai;
}
}
void emOrdem(No NoAux) {
if(NoAux != null) {
emOrdem(NoAux.esq);
System.out.println(NoAux.valor + " " + NoAux.freq);
emOrdem(NoAux.dir);
}
}
}
Eu estou querendo implementar dois metodos: o ListaNivel() que irá listar os elementos de um determinado nível da arvore (considerando a raiz nível 1) e um metodo Organiza() que organize a arvore priorizando os nós com maior frequencia (os que forem mais consultados. Ou seja, aqueles que tiverem maior frequencia irão para cima e a arvore deve ser reorganizada em ordem a continuar a ser de busca binaria).
O reordenamento da arvore eu já consegui mais ou menos implementar, mas sua complexidade ficou muito alta! Gostaria de saber um algoritmo que a implementasse com a menor possivel (é importante)! Por favor, me ajudem!
Agradeço antecipadamente!