viernes, 16 de diciembre de 2011

Arbol binario en C++

El semestre pasado me tope con este concepto, si han buscado un poco sabran que un arbol binario es una estructura de datos util cuando se trata de hacer modelos de procesos en donde se quiere tomar desiciones en uno de los dos sentidos en cara parte del proceso.

Los arboles binarios sirven para realizar bases de datos donde la búsqueda y almacenamiento sean optimos, debido a que en un arbol los datos no se almacenan de forma lineal como una pila o una cola, donde los datos que entran solo se pueden leer en respectivo orden de entrada. Entre otras aplicaciones de los arboles binarios encontramos la encriptación de archivos o la creación de compiladores.

A continuación algunos de los procesos básicos utilizando arboles binarios (al final pueden descargar el código completo)

Nota: los métodos y procedimientos para un árbol binario deben ser recursivos.

Clase para el nodo de información: 
#include <stdlib.h>

class Nodo
{
    public:
        int info;
        Nodo *Llink; //enlace izquierdo
        Nodo *Rlink; //enlace derecho   
        Nodo(int);
        ~Nodo();
};

Nodo::Nodo(int info)
{
    this->info = info;
    Llink = NULL;
    Rlink = NULL;    
}

Nodo::~Nodo()
{ }

Clase para el árbol binario:
#include "nodo.h"
#include <iostream>

using namespace std;

class Arbin
{
    private:
        Nodo *raiz;
        Nodo *Insertar(Nodo*,Nodo*);
        Nodo *Borrar(Nodo*, int);
        int  getInfo_der(Nodo*);
        void preOrden(Nodo*);
        void inOrden(Nodo*);
        void postOrden(Nodo*);
    public:
        Arbin();
        void Crear(Nodo*);
        void Recorridos(int);
        void Eliminar(int);
        ~Arbin();
}; 

Algunos métodos básicos:
Inserción 
Nodo* Arbin::Insertar(Nodo *p, Nodo *q){
    if(p == NULL){
        p = q;
    }
    else{
        if(q->info < p->info){
            p->Llink = Insertar(p->Llink,q);
        }
        else{
            p->Rlink = Insertar(p->Rlink,q);
        }
    }
    
    return p;
}

Recorridos
void Arbin::preOrden(Nodo *p){
    if(p != NULL){
        cout << p->info << ", ";
        preOrden(p->Llink);
        preOrden(p->Rlink);
    }
}

void Arbin::inOrden(Nodo *p){
    if(p != NULL){        
        inOrden(p->Llink);
        cout << p->info << ", ";
        inOrden(p->Rlink);
    }
}

void Arbin::postOrden(Nodo *p){
    if(p != NULL){
        cout << p->info << ", ";
        postOrden(p->Llink);
        postOrden(p->Rlink);
    }
}

Estos solo son algunos métodos, pero pueden descargar el ejemplo completo AQUÍAQUÍ.

Debo agradecer mi profesor de estructura de información, Ricardo Contreras por compartir muchos de estos algoritmos que han sido mejorados por el a lo largo de su experiencia como docente.

4 comentarios: