150 likes | 306 Views
Arboles binarios de búsqueda. Elemento estándar: Cuenta. class Cuenta { public: int codigo; char nombreCliente[50]; float saldo; public: Cuenta(); Cuenta(int codi,float saldoInic); int key(); };. Cuenta::Cuenta() { codigo=0; saldo=0.0; nombreCliente[0]=''; }
E N D
Elemento estándar: Cuenta class Cuenta { public: int codigo; char nombreCliente[50]; float saldo; public: Cuenta(); Cuenta(int codi,float saldoInic); int key(); };
Cuenta::Cuenta() { codigo=0; saldo=0.0; nombreCliente[0]='\0'; } Cuenta::Cuenta(int codi, float saldoInic) { codigo=codi; saldo=saldoInic; cout<<"Escriba el nombre del cliente: "; cin>>nombreCliente; } int Cuenta::key() { return codigo; }
La clase Nodo class Nodo { public: Cuenta dato; Nodo *hijoIzq; //Apuntador a hijo izquierdo Nodo *hijoDer; //Apuntador a hijo derecho public: Nodo(Cuenta nDato); //Constructor }; Nodo::Nodo(Cuenta nDato) //Constructor { dato = nDato; hijoIzq = NULL; hijoDer = NULL; }
La clase ArbolBin class ArbolBin { public: Nodo *raiz; //Apunta a la raíz del arbol Nodo *actual; public: ArbolBin(); //Constructor void insertar(Cuenta dato); void buscar_lugar(Nodo *r, Cuenta dato); //Recorridos: void inorden(Nodo *r); void preorden(Nodo *r); void posorden(Nodo *r); };
//Constructor ArbolBin::ArbolBin() { raiz=NULL; actual=NULL; }
void ArbolBin::insertar(Cuenta dato) { if(raiz == NULL) //Si árbol vacío { raiz = new Nodo(dato); //Crea el nodo actual=raiz; //El nuevo a su vez es el actual } else //Arbol no vacío buscar_lugar(raiz, dato); }
void ArbolBin::buscar_lugar(Nodo *r, Cuenta dato) { if(r) //Si puntero no nulo { if( (r->dato).key() > dato.key() ) // Si clave del nuevo es menor // que la clave de r { if( !r->hijoIzq ) // Si r no tiene hijo izq { r->hijoIzq =new Nodo(dato); //Lo crea e inserta actual=r->hijoIzq; } else buscar_lugar(r->hijoIzq, dato); //Sigue buscando }
else if( (r->dato).key() < dato.key()) // Si clave del nuevo es // mayor que la clave de r { if(!r->hijoDer) // Si no tiene hijo der { r->hijoDer =new Nodo(dato); //Lo crea e inserta actual=r->hijoDer; } else buscar_lugar(r->hijoDer, dato); //Sigue buscando } } else { cout<<"¡Error! referencia a nodo invalida"; } } Nótese que si el nuevo está repetido en el árbol, no se inserta
//Recorridos void ArbolBin::preorden(Nodo *r) { if(r) //Si es no nulo { cout<<" "<<(r->dato).codigo<<" "; preorden(r->hijoIzq); preorden(r->hijoDer); } }
void ArbolBin::posorden(Nodo *r) { if(r) //Si es no nulo { posorden(r->hijoIzq); posorden(r->hijoDer); cout<<" "<<(r->dato).codigo<<" "; } }
void ArbolBin::inorden(Nodo *r) { if(r) //Si es no nulo { inorden(r->hijoIzq); cout<<" "<<(r->dato).codigo<<" "; inorden(r->hijoDer); } }
Programa Principal para comprobar el funcionamiento void main(void) { //Se crea un árbol ArbolBin miarbol; //Se crea una cuenta que va a ser insertada en el árbol Cuenta cuenta1(20, 1000); miarbol.insertar(cuenta1); Cuenta cuenta2(10, 2000); miarbol.insertar(cuenta2); Cuenta cuenta3(30, 5000); miarbol.insertar(cuenta3);
//Se ha creado un árbol con raíz 20, //hijo izquierdo 10 e hijo derecho 30 //Ahora comprobemos con los recorridos: cout<<endl<<"Inorden: "; miarbol.inorden(miarbol.raiz); //Imprimió 10 20 30 cout<<endl<<"Preorden: "; miarbol.preorden(miarbol.raiz); //Imprimió 20 10 30 cout<<endl<<"Posorden: "; miarbol.posorden(miarbol.raiz); //Imprimió 10 30 20 }