Arvores de Busca Binaria

0 respostas
B

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!

Criado 2 de julho de 2009
Respostas 0
Participantes 1