Está en la página 1de 7

#include <iostream>

using namespace std;

class Arbol{

private:

class Nodo {

public:

Nodo(const int dat, Nodo *izq=NULL, Nodo *der=NULL) :

dato(dat), izquierdo(izq), derecho(der) {}

int dato;

Nodo *izquierdo;

Nodo *derecho;

};

Nodo *raiz;

Nodo *actual;

int contador;

int altura;

public:

Arbol() : raiz(NULL), actual(NULL) {}

void Insertar(const int dat);

void Borrar(const int dat);

bool Buscar(const int dat);

bool Vacio(Nodo *r) { return r==NULL; }

bool EsHoja(Nodo *r) { return !r->derecho && !r->izquierdo; }

const int NumeroNodos();

const int AlturaArbol();

int Altura(const int dat);


int &ValorActual() { return actual->dato; }

void Raiz() { actual = raiz; }

void InOrden(void (*func)(int&) , Nodo *nodo=NULL, bool r=true);

void PreOrden(void (*func)(int&) , Nodo *nodo=NULL, bool r=true);

void PostOrden(void (*func)(int&) , Nodo *nodo=NULL, bool r=true);

private:

void Podar(Nodo* &);

void auxContador(Nodo*);

void auxAltura(Nodo*, int);

};

void Arbol::Insertar(const int dat)

Nodo *padre = NULL;

actual = raiz;

while(!Vacio(actual) && dat != actual->dato) {

padre = actual;

if(dat > actual->dato) actual = actual->derecho;

else if(dat < actual->dato) actual = actual->izquierdo;

if(!Vacio(actual)) return;

if(Vacio(padre)) raiz = new Nodo(dat);

else if(dat < padre->dato) padre->izquierdo = new Nodo(dat);

else if(dat > padre->dato) padre->derecho = new Nodo(dat);

}
void Arbol::InOrden(void (*func)(int&) , Nodo *nodo, bool r)

if(r) nodo = raiz;

if(nodo->izquierdo) InOrden(func, nodo->izquierdo, false);

func(nodo->dato);

if(nodo->derecho) InOrden(func, nodo->derecho, false);

void Arbol::PreOrden(void (*func)(int&), Nodo *nodo, bool r)

if(r) nodo = raiz;

func(nodo->dato);

if(nodo->izquierdo) PreOrden(func, nodo->izquierdo, false);

if(nodo->derecho) PreOrden(func, nodo->derecho, false);

void Arbol::PostOrden(void (*func)(int&), Nodo *nodo, bool r)

if(r) nodo = raiz;

if(nodo->izquierdo) PostOrden(func, nodo->izquierdo, false);

if(nodo->derecho) PostOrden(func, nodo->derecho, false);

func(nodo->dato);

bool Arbol::Buscar(const int dat)

actual = raiz;

while(!Vacio(actual)) {

if(dat == actual->dato) return true; // int encontrado


else if(dat > actual->dato) actual = actual->derecho; // Seguir

else if(dat < actual->dato) actual = actual->izquierdo;

return false;

int Arbol::Altura(const int dat)

int altura = 0;

actual = raiz;

while(!Vacio(actual)) {

if(dat == actual->dato) return altura; // int encontrado

else {

altura++;

if(dat > actual->dato) actual = actual->derecho;

else if(dat < actual->dato) actual = actual->izquierdo;

return -1;

const int Arbol::NumeroNodos()

contador = 0;

auxContador(raiz);

return contador;

}
void Arbol::auxContador(Nodo *nodo)

contador++;

if(nodo->izquierdo) auxContador(nodo->izquierdo);

if(nodo->derecho) auxContador(nodo->derecho);

const int Arbol::AlturaArbol()

altura = 0;

auxAltura(raiz, 0);

return altura;

void Arbol::auxAltura(Nodo *nodo, int a)

if(nodo->izquierdo) auxAltura(nodo->izquierdo, a+1);

if(nodo->derecho) auxAltura(nodo->derecho, a+1);

if(EsHoja(nodo) && a > altura) altura = a;

void Mostrar(int &d)

cout << d << ",";

int main()

Arbol ArbolInt;

ArbolInt.Insertar(10);
ArbolInt.Insertar(5);

ArbolInt.Insertar(12);

ArbolInt.Insertar(4);

ArbolInt.Insertar(7);

ArbolInt.Insertar(3);

ArbolInt.Insertar(6);

ArbolInt.Insertar(9);

ArbolInt.Insertar(8);

ArbolInt.Insertar(11);

ArbolInt.Insertar(14);

ArbolInt.Insertar(13);

ArbolInt.Insertar(2);

ArbolInt.Insertar(1);

ArbolInt.Insertar(15);

ArbolInt.Insertar(10);

ArbolInt.Insertar(17);

ArbolInt.Insertar(18);

ArbolInt.Insertar(16);

cout << "Altura de arbol " << ArbolInt.AlturaArbol();

cout << "InOrden: ";

ArbolInt.InOrden(Mostrar);

cout << endl;

cout << "PreOrden: ";

ArbolInt.PreOrden(Mostrar);

cout << endl;

cout << "PostOrden: ";


ArbolInt.PostOrden(Mostrar);

cout << endl;

cout << "N nodos: " << ArbolInt.NumeroNodos();

cout << "Altura de 1 " << ArbolInt.Altura(1);

cout << "Altura de 10 " << ArbolInt.Altura(10);

cout << "Altura de arbol " << ArbolInt.AlturaArbol();

cin.get();

return 0;

También podría gustarte