Sunteți pe pagina 1din 11

Ejempl

o 1 de
rbol:
#include <iostream>

#include <cstdlib>
using namespace std;
struct nodo{
int nro;
struct nodo *izq, *der;
};
typedef struct nodo *ABB;
/* es un puntero de tipo nodo que hemos llamado ABB, que
ulitizaremos
para mayor facilidad de creacion de variables */
ABB crearNodo(int x)
{
ABB nuevoNodo = new(struct nodo);
nuevoNodo->nro = x;
nuevoNodo->izq = NULL;
nuevoNodo->der = NULL;
return nuevoNodo;
}

void insertar(ABB &arbol, int x)


{
if(arbol==NULL)
{
arbol = crearNodo(x);
}
else if(x < arbol->nro){
insertar(arbol->izq, x);}
else if(x > arbol->nro){
insertar(arbol->der, x);}
}
void preOrden(ABB arbol)
{
if(arbol!=NULL)
{
cout << arbol->nro <<" ";
preOrden(arbol->izq);
preOrden(arbol->der);
}
}
void enOrden(ABB arbol)
{
if(arbol!=NULL)
{
enOrden(arbol->izq);
cout << arbol->nro << " ";
enOrden(arbol->der);
}
}
void postOrden(ABB arbol)
{
if(arbol!=NULL)
{

postOrden(arbol->izq);
postOrden(arbol->der);
cout << arbol->nro << " ";
}
}
void verArbol(ABB arbol, int n)
{
if(arbol==NULL)
return;
verArbol(arbol->der, n+1);
for(int i=0; i<n; i++)
cout<<" ";
cout<< arbol->nro <<endl;
verArbol(arbol->izq, n+1);
}
int main()
{
ABB arbol = NULL; // creado Arbol
int n; // numero de nodos del arbol
int x; // elemento a insertar en cada nodo
cout << "\n\t\t ..[ ARBOL BINARIO DE BUSQUEDA ].. \n\n";
cout << " Numero de nodos del arbol: ";
cin >> n;
cout << endl;
for(int i=0; i<n; i++)
{
cout << " Numero del nodo " << i+1 << ": ";

cin >> x;
insertar( arbol, x);
}
cout << "\n Mostrando ABB \n\n";
verArbol( arbol, 0);
cout << "\n Recorridos del ABB";
cout << "\n\n En orden : "; enOrden(arbol);
cout << "\n\n Pre Orden : "; preOrden(arbol);
cout << "\n\n Post Orden : "; postOrden(arbol);
cout << endl << endl;
system("pause");
return 0;
}

Ejemplo 2 de rbol:

#include <iostream.h>
#include <conio.h>
struct arbol
{
int dato;
arbol *i,*d;
}*elemento, *aux, *cabecera, *ant, *aux2, *ant2;

int dato;
int buscar();
void insertar();
void buscarmenmay();
void buscarmaymen();
void eliminar();
void main()
{
int y,opc;
do
{
clrscr();
cout<<"0 - Salir";
cout<<"1 - Buscar";
cout<<"2 - Insertar";
cout<<"3 - Borrar";
cout<<"Cual es su opcion: ";
cin>>opc;
switch(opc)
{
case 0: break;
case 1: cout<<"\n\nDato a buscar: ";
cin>>dato;
if(buscar())
cout<<"\n\nDato existe";
else
cout<<"\n\nDato inexistente";
break;
case 2: cout<<"\n\nDato a insertar: ";
cin>>dato;
insertar();
cout<<"\n\nDato Insertado";
break;
case 3: cout<<"\n\nDato a borrar: ";
cin>>dato;
eliminar();
break;
default: cout<<"\n\nOpcion incorrecta";
}
if(opc) getch();
}while(opc);
}
int buscar()
{
if(!cabecera)
{
cout<<"No hay arbol";
return(0);
}
ant=NULL;
aux=cabecera;
while(aux)
{
if (dato==aux->dato)
return(1);
else

{
ant=aux;
if (dato>aux->dato)
aux=aux->d;
else
aux=aux->i;
}
}
return(0);
}
void insertar()
{
if(!cabecera)
{
cabecera=new(arbol);
cabecera->dato=dato;
cabecera->d=NULL;
cabecera->i=NULL;
return;
}
if (!buscar())
{
aux=new(arbol);
aux->dato=dato;
aux->i=NULL;
aux->d=NULL;
if(dato>ant->dato)
ant->d=aux;
else
ant->i=aux;
}
else
cout<<"\n\nDato existente";
}
void buscarmenmay()
{
aux2=aux->d;
ant2=aux;
while(aux2->i)
{
ant2=aux2;
aux2=aux2->i;
}
aux->dato=aux2->dato;
if(aux2->d)
ant2->i=aux2->d;
delete(aux2);
ant2->d=NULL;
}
void buscarmaymen()
{
aux2=aux->i;
ant2=aux;
while(aux2->d)
{
ant2=aux2;
aux2=aux2->d;

}
aux->dato=aux2->dato;
if(aux2->i)
ant2->d=aux2->i;
delete(aux2);
ant2->i=NULL;
}
void eliminar()
{
if(!buscar())
{
cout<<"\n\nElemento no encontrado.";
return;
}
if(aux->d==NULL && aux->i==NULL)
{
if(ant->dato>dato)
ant->i=NULL;
else
ant->d=NULL;
delete(aux);
}
else
if(aux->d!=NULL)
buscarmenmay();
else
buscarmaymen();
cout<<"\n\nElemento Borrado";
}

ENFOCADO EN SOLO ELIMINAR:


void EliminarHi(int d)
{
//Buscamos el elemento(numero)
bool SiEncontro = false;
if(VacioAB())
{
cout<<El Arbol Binario Esta limpio! <<endl;

return;
}
NodoArbol* NoHo;
NodoArbol* PadreAB;
NoHo = Raiz;
while(NoHo != NULL)
{
if(NoHo->Dato == d)
{
SiEncontro = true;
break;
}
else
{
PadreAB = NoHo;
if(d>NoHo->Dato) NoHo = NoHo->derecho;
else NoHo = NoHo->izquierda;
}
}
if(!SiEncontro)
{
cout<<Dato no se encontro<<endl;
return;
}
// casos:
// 1. Estamos eliminando un nodo hoja
// 2. Estamos eliminando un nodo con un solo hijo
// 3. estamos eliminando un nodo con 2 hijos
// Nodo con uno de los hijos
if((NoHo->izquierda == NULL && NoHo->derecho != NULL)|| (NoHo>izquierda != NULL && NoHo->derecho == NULL))
{
if(NoHo->izquierda == NULL && NoHo->derecho != NULL)
{

if(PadreAB->izquierda == NoHo)
{
PadreAB->izquierda = NoHo->derecho;
delete NoHo;
}
else
{
PadreAB->derecho = NoHo->derecho;
delete NoHo;
}
}
else //Izquierda hijo est presente, no hay hijo derecho.
{
if(PadreAB->izquierda == NoHo)
{
PadreAB->izquierda = NoHo->izquierda;
delete NoHo;
}
else
{
PadreAB->derecho = NoHo->izquierda;
delete NoHo;
}
}
return;
}

//Nodo u hoja
if( NoHo->izquierda == NULL && NoHo->derecho == NULL)
{
if(PadreAB->izquierda == NoHo) PadreAB->izquierda = NULL;
else PadreAB->derecho = NULL;
delete NoHo;
return;
}

//Nodo con 2 hijos


// reemplazar el nodo con menor valor en el subrbol derecho
if (NoHo->izquierda != NULL && NoHo->derecho != NULL)
{
NodoArbol* chkr;
chkr = NoHo->derecho;
if((chkr->izquierda == NULL) && (chkr->derecho == NULL))
{
NoHo = chkr;
delete chkr;
NoHo->derecho = NULL;
}
else // Si hijo derecho tiene hijos
{
//si es hijo derecho del nodo tiene un hijo izquierdo
//Mover todo el camino a la izquierda para localizar elemento ms pequeo
if((NoHo->derecho)->izquierda != NULL)
{
NodoArbol* lNoHo;
NodoArbol* lNoHop;
lNoHop = NoHo->derecho;
lNoHo = (NoHo->derecho)->izquierda;
while(lNoHo->izquierda != NULL)
{
lNoHop = lNoHo;
lNoHo = lNoHo->izquierda;
}
NoHo->Dato = lNoHo->Dato;
delete lNoHo;
lNoHop->izquierda = NULL;
}
else
{
NodoArbol* Temporal;
Temporal = NoHo->derecho;
NoHo->Dato = Temporal->Dato;
NoHo->derecho =Temporal->derecho;

delete Temporal;
}
}
return;
}
}

S-ar putea să vă placă și