Arvore AVL em C++

domingo, 25. abril 2010

Bom galera.. vou postar para vcs o código de Arvore AVL que fiz hj… me baseei no código de arvore binária que eu jah tinha feito… seguem então os codigos

AVL.h

#include 
#include 
#ifndef AVL
#define	AVL

using namespace std;

namespace ED {

    template 
    class AVLTree {
    public:
        AVLTree();
        ~AVLTree();
        //metodos principais
        void insere(Tipo el);
        void percursoEmOrdem();
        void desaloca();
        int tamanho();
        int altura();

    private:
        class Celula {
        public:
            Tipo el;
            Celula *esq, *dir;
            char h;
            char b;
        };
        int height(Celula *x);
        void inorder_Walk(Celula *x);
        void removeCels(Celula *x);
        void balanceia(Celula *&x);
        void atualiza(Celula *&x);
        void rotateLeft(Celula *&x);
        void rotateRight(Celula *&x);
        void desaloca(Celula *x);
        void insere(Celula* &x, Tipo &el);
        Celula *T;
        unsigned int nelem, h;
    };

    //Construtor
    template 
    AVLTree::AVLTree() {
        T = new Celula;
        T->esq = NULL;
        T->dir = NULL;
        nelem = 0;
    }

    //Destrutor
    template 
    AVLTree::~AVLTree() {
        this->desaloca(T);
    }

    //Desaloca a arvore
    template 
    void AVLTree::desaloca() {
        desaloca(T);
    }

    //Desaloca a célula
    template 
    void AVLTree::desaloca(Celula *x) {
            if (x == NULL)
                return;
            else{
              desaloca(x->esq);
              desaloca(x->dir);
              delete x;
              atualiza(x);
              balanceia(x);
            }
    }

    //Balanceamento
    template 
    void AVLTree::balanceia(Celula *&x) {
         if (x->b == 2) {
            if (x->esq->b == -1) rotateLeft(x->esq);
               rotateRight(x);
         }
         else if (x->b == -2) {
              if (x->dir->b == 1) rotateRight(x->dir);
                 rotateLeft(x);
         }
     }

    //Atualização numero altura e balanceamento
    template 
    void AVLTree::atualiza(Celula *&x) {
         unsigned char hesq = x->esq? (x->esq->h) : 0;
         unsigned char hdir = x->dir? (x->dir->h) : 0;
         x->b = hesq - hdir;
         x->h = 1 + (hesq > hdir? hesq : hdir);
    }   

    //Rotação Direita
    template 
    void AVLTree::rotateRight(Celula *&x) {
         Celula *aux = x;
         x = x->esq;
         aux->esq = x->dir;
         x->dir = aux;
         atualiza(aux);
         atualiza(x);
    }

    //Rotação Esquerda
    template 
    void AVLTree::rotateLeft(Celula *&x) {
         Celula *aux = x;
         x = x->dir;
         aux->dir = x->esq;
         x->esq = aux;
         atualiza(aux);
         atualiza(x);
    }

    //Inserção
    template 
    void AVLTree::insere(Tipo el) {
      insere(T, el);
    }

    template 
    void AVLTree::insere(Celula* &x, Tipo &el) {
        if (!x) {
            x = new Celula();
            x->el = el;
            nelem++;
        } else {
            if (x->el >= el) insere(x->esq, el);
            else insere(x->dir, el);
            atualiza(x);
            balanceia(x);
        }
    }

    //Altura árvore
    template
    int AVLTree::altura() {
        return height(T);
    }

    //Altura célula
    template
    int AVLTree::height(Celula *x) {
        int esq, dir;
        if (x == NULL) return 0;
        esq = height(x->esq);
        dir = height(x->dir);
        if (esq > dir)
            return esq + 1;
        else
            return dir + 1;
    }

    //Número de elementos arvore
    template 
    int AVLTree::tamanho() {
        return (nelem);
    }

    //Remanescência BSTree ordenação
    template
    void AVLTree::inorder_Walk(Celula *x) {
        if (x == NULL) return;
        inorder_Walk(x->esq);
        cout << x->el << endl;
        inorder_Walk(x->dir);
    }

    template
    void AVLTree::percursoEmOrdem() {
        this->inorder_Walk(T);
    }

}

#endif

e o main.cpp (que foi o exercicio proposto pelo professor

#include 
#include 
#include "AVL.h"

#define T int

using namespace std;
using namespace ED;

int main(int argc, char** argv) {

    cout << "Arvore AVL."< *avl;
    avl = new AVLTree();

    for(int c=0; c<1023; c++){
      avl->insere(rand());
    }
    cout << "10"<< avl->altura() <desaloca();

    avl = new AVLTree();

    for(int c=0; c<32767; c++){
      avl->insere(rand());
    }
    cout << "15"<< avl->altura() <desaloca();

    avl = new AVLTree();

    for(int c=0; c<1048575; c++){
      avl->insere(rand());
    }
    cout << "20"<< avl->altura() <desaloca();

    avl = new AVLTree();

    for(int c=0; c<4194303; c++){
      avl->insere(rand());
    }
    cout << "25"<< avl->altura() <desaloca();

}

Leave a Reply

You must be logged in to post a comment.