You are on page 1of 4

////////////////////////////////////////////////////////////////////// // ArbolBinario.cpp: Clase ArbolBinario. // Curso: Estructura de Datos y Algoritmos - Ing. Oliver Vilca.

// Puno, Julio del 2013 ////////////////////////////////////////////////////////////////////// #include <iostream> using namespace std; struct Nodo{ int Dato; Nodo *Izquierda; Nodo *Derecha; }; class ArbolBinario { Nodo *Raiz; // Puntero al Nodo raiz. public: ArbolBinario(); // Constructor void Buscar(int); Nodo* BusquedaRecursiva(int, Nodo*); Nodo* BusquedaRecursiva2(int, Nodo*); // Optimizada void Insertar(int valor, Nodo** nodo); void Insertar(int valor); void PreOrden(Nodo* n); void PreOrden(); void Borrar(int valor); void Borrar (int valor, Nodo** ); void Reemplazar(Nodo**, Nodo**); Nodo* ObtenerRaiz(); Nodo* AgregarNodo(int valor); }; ArbolBinario::ArbolBinario() // Constructor { Raiz = NULL; } Nodo* ArbolBinario::BusquedaRecursiva(int x, Nodo* nodo) { if( nodo == NULL) // Si el rbol esta vac-o, retornar NULL return NULL; if( x == nodo->Dato ) // Si x es igual al valor de nodo return nodo; if( x < nodo->Dato ) // Si x es menor al valor del nodo return BusquedaRecursiva( x , nodo->Izquierda); else if(x > nodo->Dato ) // Si x es mayor al valor del nodo return BusquedaRecursiva( x , nodo->Derecha); }

Nodo* ArbolBinario::BusquedaRecursiva2(int x, Nodo* nodo) { if( nodo == NULL || x == nodo->Dato ) return nodo; if( x < nodo->Dato ) return BusquedaRecursiva2( x , nodo->Izquierda); else return BusquedaRecursiva2( x , nodo->Derecha); } void ArbolBinario::Buscar(int x) { Nodo* no = BusquedaRecursiva2(x,Raiz); if( no == NULL ) cout<< "No Encontrado" << endl; else cout<< "Encontrado: " << no->Dato << endl; } void ArbolBinario::Insertar(int valor, Nodo** nodo) { if( *nodo == NULL) // Si el rbol esta vac-o *nodo = AgregarNodo(valor); else if( valor == (*nodo)->Dato ); // Si ya existe el valor else if( valor < (*nodo)->Dato ) // Si es menor al valor del nodo if ( (*nodo)->Izquierda == NULL ) (*nodo)->Izquierda = AgregarNodo(valor); else Insertar( valor , &(*nodo)->Izquierda ); else // Si es mayor al valor del nodo if ( (*nodo)->Derecha == NULL ) (*nodo)->Derecha = AgregarNodo(valor); else Insertar( valor , &(*nodo)->Derecha ); } Nodo* ArbolBinario::AgregarNodo(int valor) { Nodo *n = new Nodo(); n->Dato = valor; cout<<"Insertando: "<<n->Dato<<endl; n->Izquierda = NULL; n->Derecha = NULL; return n; } void ArbolBinario::Insertar(int valor) { Insertar( valor, &Raiz ); }

void ArbolBinario::Borrar(int valor){ Borrar( valor, &Raiz); } void ArbolBinario::Borrar(int valor, Nodo** n){ if (*n==NULL) // si el nodo es nulo (vacio) { return; //no hay nada que borrar } if (valor>(*n)->Dato) //si valor < dato del nodo Borrar(valor,&(*n)->Derecha); else if(valor<(*n)->Dato) // si valor > dato del nodo Borrar(valor,&(*n)->Izquierda); else // if (valor==*nodo->Dato) { Nodo *t; t=*n; if ((*n)->Izquierda==NULL) *n=(*n)->Derecha; else if ((*n)->Derecha==NULL) *n=(*n)->Izquierda; else Reemplazar(&(*n)->Izquierda,&t); } } void ArbolBinario::Reemplazar (Nodo** a, Nodo** t){ if((*a)->Derecha==NULL){ (*t)->Dato=(*a)->Dato; *t=*a; *a=(*a)->Izquierda; } else Reemplazar(&(*a)->Derecha,t); } void ArbolBinario::PreOrden(Nodo* n) { //cout<<"go1"<<endl; if( n != NULL){ cout<< n->Dato; //cout<<"go2"<<endl; PreOrden(n->Izquierda); PreOrden(n->Derecha); } } void ArbolBinario::PreOrden() { PreOrden(Raiz); cout<<"Fin PreOrden"<<endl;

} int main() { ArbolBinario A; A.Buscar(5); A.Insertar(5); A.Insertar(3); A.Insertar(8); A.Insertar(4); A.PreOrden(); A.Buscar(5); A.Buscar(3); A.Borrar(7); A.Borrar(3); A.Borrar(4); A.Borrar(8); A.Borrar(5); }

You might also like