Está en la página 1de 4

17 Adems de estos recorridos tradicionales, se tienen los recorridos conversos en los que el orden de recorrido se invierte a derecha-izquierda, en vez

de izquierdaderecha. Finalmente, existe un recorrido llamado nivel p o r nivel, en el que los nodos del rbol se visitan por niveles a partir del 0, y de izquierda a derecha. Este algoritmo puede plantearse iterativamente, utilizando una fila de la siguiente manera: 1. Inserte el apuntador al nodo raz a una fila. 2. Mientras la fila no se vace: Saque el apuntador de la fila y procese el nodo sealado. Inserte en la fila los apuntadores de los hijos del nodo procesado (si stos existen). Programa de rboles Binarios
// Arboles_Binarios.cpp : main project file. #include"stdafx.h" #include"iostream" using namespace System; using namespace std; class nodoarbol { public: int info; nodoarbol *der, *izq; nodoarbol() { izq=NULL; der=NULL;

nodoarbol(int dato) { info=dato; izq=NULL; der=NULL;

};

class ABB { private: public: ABB () { nodoarbol *raiz;

raiz=NULL; -ABB() { cout "Entro al destructor "endl; borrar_nodos(raiz); cout"Salgo del destructor "endl ;

void borrar nodos{nodoarbol *raiz)

if(raiz != NULL) { borrar_nodos(raiz->izq); borrar_nodos(raiz->der); cout"Destructor de "<<raiz->infoendl delete raiz;

void insertar()

} {

nodoarbol *auxl, *aux2, *aux3; auxl=new nodoarbol; aux2=raiz; aux3=NULL; cout"Entre el valor del nodo a insertar:"; cin>>auxl->info; while(aux2!=NULL) { aux3=aux2; if(auxl->info>aux2->info) aux2=aux2->der; else aux2=aux2->izq; if(aux3==NULL) raiz=auxl; else if (auxl->info<aux3->info) aux3->izq=auxl; else aux3->der=auxl;

nodoarbol *devolver_raiz() {

return raiz;

void despliega(nodoarbol *raiz) { if(raiz!=NULL) { despliega(raiz->izq); coutraiz->infoendl; despliega(raiz->der);

void eliminar_nodo(int valor) { nodoarbol *auxl, *aux2, *temp; bool b; // Inicio de la busqueda del nodo a eliminar if(raiz!=NULL) { auxl=raiz; aux2=NULL; while(auxl->info!=valor) { aux2=auxl; if(valor<auxl->info) auxl=auxl->izq; else auxl=auxl->der; if(auxl==NULL)

19

C O U t < < " E L NODO A ELIMINAR NO EXISTE"endl;

else { cout"EL ARBOL NO CONTIENE NODOS"endl; auxl=NULL;

break;

// Fin de la busqueda del nodo a eliminar. // En auxl queda la direccin del nodo a eliminar. // En aux2 queda la direccin del nodo padre del nodo a // eliminar if(auxl!=NULL) { //Cuando no tiene hijos temp=auxl; if((auxl->izq==NULL)&&(auxl->der==NULL)) { if(aux2!=NULL) { if(auxl->info>aux2->info) aux2->der=NULL; else aux2->izq=NULL;

else {

else { if((auxl->izq!=NULL)&&(auxl->der!=NULL)) { //Cuando tiene dos hijos aux2=auxl; //con el predecesor temp=auxl->izq; b=true; while(temp->der!=NULL) { aux2=temp; temp=temp->der; b=false;

raiz=NULL;

auxl->info=temp->info; if(b==true)auxl->izq=temp->izq; else {


if(temp->izq!=NULL) aux2->der=terap->izq;

else { //cuando tiene un solo hijo if(auxl->izq==NULL) if(aux2!=NULL) { if(auxl->info<aux2->info) aux2->izq=auxl->der ; else aux2->der=auxl->der; else raiz=auxl->der;

else aux2->der=NULL;

20
else if(aux2!=NULL) { if(auxl->info<aux2->info) aux2->izq=auxl->izq;

};

delete temp;

else raiz=auxl->izq;

else aux2->der=auxl->izq;

void main() { nodoarbol *raiz; char resp; int valor; ABB n; do { n.insertar (); cout"Desea crear otro nodo (s/n):"; cin>>resp; coutendl; resp=tolower(resp); }while(resp!='n'); cout"LOS NODOS DEL ARBOL (inorden) SON "endl; raiz=n.devo!ver_raiz(); n.despliega(raiz); do { cout<<"Entre el valor del nodo a eliminar"endl; cin>>valor; n.eliminar_nodo(valor); coutendl; cout"LOS NODOS DEL ARBOL (inorden) SON"endl; raiz=.devolver_raiz(); n.despliega(raiz); cout"Desea eliminar otro nodo (s/n) : "endl; cin>>resp; cout<<endl; resp=tolower(resp); }while(resp! = 'n*) ;

También podría gustarte