Arboles binarios de búsqueda
description
Transcript of Arboles binarios de búsqueda
![Page 1: Arboles binarios de búsqueda](https://reader036.fdocuments.es/reader036/viewer/2022082407/568147b3550346895db4f620/html5/thumbnails/1.jpg)
Arboles binarios de búsqueda
![Page 2: Arboles binarios de búsqueda](https://reader036.fdocuments.es/reader036/viewer/2022082407/568147b3550346895db4f620/html5/thumbnails/2.jpg)
Elemento estándar: Cuenta
class Cuenta{
public:int codigo;char nombreCliente[50];float saldo;
public:Cuenta();Cuenta(int codi,float saldoInic);int key();
};
![Page 3: Arboles binarios de búsqueda](https://reader036.fdocuments.es/reader036/viewer/2022082407/568147b3550346895db4f620/html5/thumbnails/3.jpg)
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;}
![Page 4: Arboles binarios de búsqueda](https://reader036.fdocuments.es/reader036/viewer/2022082407/568147b3550346895db4f620/html5/thumbnails/4.jpg)
La clase Nodoclass 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;
}
![Page 5: Arboles binarios de búsqueda](https://reader036.fdocuments.es/reader036/viewer/2022082407/568147b3550346895db4f620/html5/thumbnails/5.jpg)
class ArbolBin{ public:
Nodo *raiz; //Apunta a la raíz del arbol Nodo *actual;
public:ArbolBin(); //Constructorvoid insertar(Cuenta dato);void buscar_lugar(Nodo *r, Cuenta dato);
//Recorridos:void inorden(Nodo *r);void preorden(Nodo *r);void posorden(Nodo *r);
};
La clase ArbolBin
![Page 6: Arboles binarios de búsqueda](https://reader036.fdocuments.es/reader036/viewer/2022082407/568147b3550346895db4f620/html5/thumbnails/6.jpg)
//ConstructorArbolBin::ArbolBin(){
raiz=NULL;actual=NULL;
}
![Page 7: Arboles binarios de búsqueda](https://reader036.fdocuments.es/reader036/viewer/2022082407/568147b3550346895db4f620/html5/thumbnails/7.jpg)
void ArbolBin::insertar(Cuenta dato){if(raiz == NULL) //Si árbol vacío
{raiz = new Nodo(dato); //Crea el nodoactual=raiz; //El nuevo a su vez es el
actual}else //Arbol no vacío
buscar_lugarbuscar_lugar(raiz, dato);}
![Page 8: Arboles binarios de búsqueda](https://reader036.fdocuments.es/reader036/viewer/2022082407/568147b3550346895db4f620/html5/thumbnails/8.jpg)
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
}
![Page 9: Arboles binarios de búsqueda](https://reader036.fdocuments.es/reader036/viewer/2022082407/568147b3550346895db4f620/html5/thumbnails/9.jpg)
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
![Page 10: Arboles binarios de búsqueda](https://reader036.fdocuments.es/reader036/viewer/2022082407/568147b3550346895db4f620/html5/thumbnails/10.jpg)
//Recorridos
void ArbolBin::preorden(Nodo *r){
if(r) //Si es no nulo{
cout<<" "<<(r->dato).codigo<<" ";preorden(r->hijoIzq);preorden(r->hijoDer);
}}
![Page 11: Arboles binarios de búsqueda](https://reader036.fdocuments.es/reader036/viewer/2022082407/568147b3550346895db4f620/html5/thumbnails/11.jpg)
void ArbolBin::posorden(Nodo *r){
if(r) //Si es no nulo{
posorden(r->hijoIzq);posorden(r->hijoDer);cout<<" "<<(r->dato).codigo<<" ";
}}
![Page 12: Arboles binarios de búsqueda](https://reader036.fdocuments.es/reader036/viewer/2022082407/568147b3550346895db4f620/html5/thumbnails/12.jpg)
void ArbolBin::inorden(Nodo *r){
if(r) //Si es no nulo{
inorden(r->hijoIzq);cout<<" "<<(r->dato).codigo<<" ";inorden(r->hijoDer);
}}
![Page 13: Arboles binarios de búsqueda](https://reader036.fdocuments.es/reader036/viewer/2022082407/568147b3550346895db4f620/html5/thumbnails/13.jpg)
void main(void){ //Se crea un árbol
ArbolBin miarbol;
//Se crea una cuenta que va a ser insertada en el árbolCuenta cuenta1(20, 1000);miarbol.insertar(cuenta1);
Cuenta cuenta2(10, 2000);miarbol.insertar(cuenta2);
Cuenta cuenta3(30, 5000);miarbol.insertar(cuenta3);
Programa Principal para comprobar el funcionamiento
![Page 14: Arboles binarios de búsqueda](https://reader036.fdocuments.es/reader036/viewer/2022082407/568147b3550346895db4f620/html5/thumbnails/14.jpg)
//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 3010 20 30
cout<<endl<<"Preorden: ";miarbol.preorden(miarbol.raiz);//Imprimió 20 10 3020 10 30
cout<<endl<<"Posorden: ";miarbol.posorden(miarbol.raiz);//Imprimió 10 30 2010 30 20
}