Вы находитесь на странице: 1из 24

CENTRO UNIVERSITARIO DE CIENCIAS

EXACTAS E INGENIERAS
El rbol Binario de Bsqueda,
implementacin dinmica
Actividad: Actividad 13.
Nombre: Godinez Romero Manuel Alejandro
Matricula: 207038836
Carrera: Ingeniera En Informtica
Materia: Estructura de datos 1
Profesor: Gutirrez Hernndez Alfredo
Turno: Matutino
Das: Martes y Jueves
Horario: 7:00 a.m. a 9:00 a.m.



Problema:
Haga un programa que genere una cantidad N (definida por el
usuario) de valores aleatorios de tipo entero en el rango de 0 a
65,535 que se inserte al rbol conforme cada valor sea
generado.
El programa mostrar en pantalla los valores generados en el
orden en que se insertan, enseguida el resultado de los
recorridos preorder, inorder y postorder, seguido de la altura
correspondiente al subrbol izquierdo y al subrbol derecho
debajo de la raz del rbol.

Requerimientos:
a)

El estilo de programacin debe ser Orientado a Objetos

Reporte.
Este programa lo comenc pensando como a ser el nodo del rbol binario
de bsqueda pensando que tena que recibir todo por referencia para que
fuera modificable entonces primeramente comenc declarando de tipo
templete un dato despus un hijo izquierdo y un hijo derecho un nodo
padre que toda va o utilizo en este programa pero que me servir para el
siguiente despus de tipo mita de entero declare una altura para saber la
altura del rbol y un peso para saber el nmero de nodos en el rbol
despus comenc en mi parte publica a declarar mis mtodos pblicos de
mi nodo comenc por declarar mi constructor mis geter y seter y comenc
a poner todo en una posicin nula y tambin a declarar mis datos de los
geter y despus de los seter despus hice una funcin para saber el peso
del rbol donde primero verifico que no se nulo los hijos del rbol y
despus digo que si el hijo izquierdo es nulo entonces a peso le doy el valor
del sub rbol izquierdo mas uno por la raz despus comienzo a tomar la
altura desde el nodo que la verdad no estoy seguro que sea as y por eso
solo la declare pero no la uso donde se est actualizando constante mente
la altura del rbol y es una funcin extra a la del get y set de le nodo asta
aqui dejo mi nodo del rbol despus comienzo por declarar mi nuevo .h
donde comienzo a ser una clase para las operaciones del rbol donde trato
de tomar lo que dijo el profe y usar mtodos privados y pblicos para

practicar ms el polimorfismo y as no dejar al usuario saber que est


trabajando con otros mtodos de mas donde no tendr acceso y comenc
a declarar una raz para el rbol despus en mis parte protegida comienzo
a ser un insertar que recibe una posicin y un dato tambin un borrar el
rbol que solo recibe una posicin tambin tengo los mtodos de imprimir
el rbol en in orden pos orden y pre orden tambin tengo un mtodo para
la altura un busca dato y dos geter uno mayor y uno menor y todos estos
mtodos reciben una posicin excepto el buscar porque recibes una
posicin y un objeto y ya en mi parte publica tengo mi constructor y mi
destructor mi geter izquierdo y mi geter derecho un busca dato un inicializa
uno de vaca un insertar dato un borra posicin que no tengo privado
tambin tengo un borrar dato que recibe un dato un imprime de pre orden,
otro de in orden y por ultimo otro de pos orden un borrar todo y un geter
altura y un get peso despus comienzo a implementar mis mtodos
privados en el insertar donde resido una posicin y un dato donde verifico
si tengo memoria para poder insertar despus comenc con el borra todo
donde elimina todos los nodos del rbol donde la mayora de las funciones
son recursivas se mandan a llamar por si solas despus en el imprime en
pre orden in orden y pos orden lo nico que hice fue darle la posicin del
hijo izquierdo y del derecho y el imprimir el dato y lo nico que ese fue
verificar que la posicin no fuera nulo e ir moviendo dependiendo el orden
de impresin el getDato que imprimo despus en la altura de mis mtodos
privados lo que hago tal y como viene en el algoritmo verifico que no sea
nula la posicin y creo dos auxiliares del tipo entero una para cada hijo
derecho e izquierdo despus los comparo con un if y as se cul es el que
debo regresar y le sumo uno por la raz despus en los geter menor y mayo
hago un recorrido pero el menor Asia la izquierda y el mayor Asia la
derecha despus en mis mtodos pblicos en mi constructor mando llamar
la funcin inicializa y despus en mi destructor mando llamar mi mtodo de
elimina todo y as me deshago de todo el rbol despus en cada uno de mis
mtodos pblicos mando llamar mis mtodos privados y as el usuario no
sabr que hay de tras de cada mtodo y ni como se est trabajando
tambin los mtodos que no pude a ser en privado son los que resido solo
un dato hay no pude a ser lo as ya por ultimo ice un men en un .h para
que no se viera en el cp. donde imprimo el pre orden el pos orden y el in
orden tambin verifico que el usuario no meta un nmero mayor a los
65535 que pide la practica ;

NodoABL.h
//
// NodoABl.h
// Actividad 13
//
// Created by manuel romero on 21/05/14.
// Copyright (c) 2014 manuel romero. All rights
reserved.
//
#ifndef Actividad_13_NodoABl_h
#define Actividad_13_NodoABl_h
template <class T>
class ablNodo{
private :
T dato;
ablNodo* hijoIzq;
ablNodo* hijoDer;
ablNodo* nodoPadre;
unsigned altura;
unsigned peso;
public:
ablNodo();
ablNodo(T);
T getDato();
ablNodo<T>*& gethijoIzq();
ablNodo<T>*& gethijoDer();
ablNodo<T>*& getNodoPadre();
unsigned getPeso();
unsigned getAltu();
//int getBalaFact();

void
void
void
void
void
void
void
void

setDato(T);
sethijoIzq(ablNodo*&);
sethijoDer(ablNodo*&);
setNodoPadre(ablNodo*&);
setAltu(unsigned);
setPeso(unsigned);
getActuAltu();
actualizarPeso();

};
template <class T>
ablNodo<T>::ablNodo(){
nodoPadre=hijoIzq=hijoIzq=nullptr;
peso = 1;
}
template <class T>
ablNodo<T>::ablNodo(T e){
dato = e;
nodoPadre=hijoIzq=hijoIzq=nullptr;
peso = 1;
}
template <class T>
T ablNodo<T>::getDato(){
return dato;
}
template <class T>
ablNodo<T>*& ablNodo<T>::gethijoIzq(){
return hijoIzq;
}
template <class T>
ablNodo<T>*& ablNodo<T>::gethijoDer(){
return hijoDer;
}

template <class T>


ablNodo<T>*& ablNodo<T>::getNodoPadre(){
return nodoPadre;
}
template <class T>
unsigned ablNodo<T>::getPeso(){
return peso;
}
template <class T>
unsigned ablNodo<T>::getAltu(){
return altura;
}
template <class T>
void ablNodo<T>::setDato(T e){
dato=e;
}
template <class T>
void ablNodo<T>::sethijoIzq(ablNodo*& pos){
hijoIzq = pos;
}
template <class T>
void ablNodo<T>::sethijoDer(ablNodo*& pos){
hijoDer = pos;
}
template <class T>
void ablNodo<T>::setNodoPadre(ablNodo*& pos){
nodoPadre = pos;
}
template <class T>
void ablNodo<T>::setPeso(unsigned pe){
peso = pe;
}

template <class T>


void ablNodo<T>::setAltu(unsigned al){
altura = al;
}
template <class T>
void ablNodo<T>::actualizarPeso(){
if((hijoIzq == nullptr && hijoDer == nullptr)){
peso = 0;
}
else{
if(hijoIzq == nullptr){
peso = hijoDer->getPeso() + 1;
}
else{
if(hijoDer == nullptr){
peso = hijoIzq->getPeso() + 1;
}
else{
if(hijoIzq->getPeso() > hijoDer>getPeso()){
peso = hijoIzq->getPeso() + 1;
}
else{
peso = hijoDer->getPeso() + 1;
}
}
}
}
}
template <class T>
void ablNodo<T>::getActuAltu(){
unsigned IzquiAltu = 0;
unsigned DereAltu = 0;
if(hijoIzq != nullptr){
IzquiAltu = hijoIzq->getAltu();

}
if(hijoDer != nullptr){
DereAltu = hijoDer->getAltu();
}
if(IzquiAltu > DereAltu ){
altura = IzquiAltu +1;
}
else{
altura = DereAltu +1;
}
}


Arbol.h
//
// Arbol.h
// Actividad 13
//
// Created by manuel romero on 23/05/14.
// Copyright (c) 2014 manuel romero. All rights
reserved.
//
#ifndef Actividad_13_Arbol_h
#define Actividad_13_Arbol_h
#include "NodoABl.h"
#include <iostream>
using namespace std;
class AblException:public exception
{
private:
string msg;
public:

virtual const char* what() const throw()


{
return msg.c_str();
}
AblException(string m)
{
msg=m;
};
};
template <class T>
class Arbol{
private:
ablNodo<T>* arbl;
void
void
void
void
void

inserDato(ablNodo<T>*& , T&);
borrarAbl(ablNodo<T>*&);
imprPreor(ablNodo<T>*&);
imprIno(ablNodo<T>*&);
imprPos(ablNodo<T>*&);

int getAltura(ablNodo<T>*&);
ablNodo<T>*& busDato (ablNodo<T>*& , T&);
ablNodo<T>*& getMenor(ablNodo<T>*&);
ablNodo<T>*& getMayor(ablNodo<T>*&);
public:
Arbol();
~Arbol();
ablNodo<T>*& getIzque();
ablNodo<T>*& getDerech();
ablNodo<T>*& busDato(T&);
void inicializa();

bool etaVacia();
void inserDato(T&);
void borraPos(ablNodo<T>*&);
void borraDato(T&);
void
void
void
void

imprPreor();
imprIno();
imprPos();
borraTodo();

int getAltura();
unsigned getPeso();
};
//*************************************************
********************
//Metodos privados
template <class T>
void Arbol<T>::inserDato(ablNodo<T>*& pos , T& e){
if(pos == nullptr){
pos = new ablNodo<T> (e);
if(!pos){
throw AblException ("Error de
posicion");
}
}else{
if(e < pos->getDato()){
inserDato(pos->gethijoIzq(), e);
}else{
inserDato(pos->gethijoDer(), e);
}

pos->actualizarPeso();
}
}
template <class T>
void Arbol<T>::borrarAbl(ablNodo<T>*& pos){
if(pos == nullptr){
return;
}
borrarAbl(pos->gethijoIzq());
borrarAbl(pos->gethijoDer());
delete pos;
pos = nullptr;

}
template <class T>
void Arbol<T>::imprPreor(ablNodo<T>*& pos){
if(pos == nullptr){
return;
}
cout<< pos->getDato()<<"-";
imprPreor(pos->gethijoIzq());
imprPreor(pos->gethijoDer());
}
template <class T>
void Arbol<T>::imprIno(ablNodo<T>*& pos){
if(pos == nullptr){
return;
}
imprIno(pos->gethijoIzq());
cout<< pos->getDato()<<"-";
imprIno(pos->gethijoDer());
}
template <class T>
void Arbol<T>::imprPos(ablNodo<T>*& pos){
if(pos == nullptr){
return;

}
imprPos(pos->gethijoIzq());
imprPos(pos->gethijoDer());
cout<< pos->getDato()<<"-";
}
template <class T>
int Arbol<T>::getAltura(ablNodo<T>*& pos){
if(pos == nullptr){
return 0;
}
int altuIzquie = getAltura(pos->gethijoIzq());
int altuDere = getAltura(pos->gethijoDer());
if (altuIzquie > altuDere) {
return altuIzquie + 1;
}else{
return altuDere + 1;
}
}
template <class T>
ablNodo<T>*& Arbol<T>::busDato (ablNodo<T>*& pos,
T& e){
if(pos == nullptr || e == pos->getDato()){
return pos;
}
if(e < pos->getDato()){
return busDato(pos->gethijoIzq(), e);
}
else{
return busDato(pos->gethijoDer(), e);
}
}
template <class T>
ablNodo<T>*& Arbol<T>::getMenor(ablNodo<T>*& pos){
if(pos == nullptr){
return nullptr;
}

ablNodo<T>*& aux = pos;

while (aux->gethijoIzq() != nullptr) {


aux = aux->gethijoIzq();
}
return aux;

template <class T>


ablNodo<T>*& Arbol<T>::getMayor(ablNodo<T>*& pos){
if(pos == nullptr){
return nullptr;
}
ablNodo<T>*& aux = pos;
while (aux->gethijoDer() != nullptr) {
aux = aux->gethijoDer();
}
return aux;
}
//*************************************************
*****************
//Metodos publicos
template <class T>
Arbol<T>::Arbol(){
inicializa();
}
template <class T>
Arbol<T>::~Arbol(){
borraTodo();
}
template <class T>
ablNodo<T>*& Arbol<T>::getIzque(){
return arbl->gethijoIzq();
}
template <class T>
ablNodo<T>*& Arbol<T>::getDerech(){

return arbl->gethijoDer();
}
template <class T>
ablNodo<T>*& Arbol<T>::busDato(T& e){
return busDato(arbl, e);
}
template <class T>
void Arbol<T>::inicializa(){
arbl = nullptr;
}
template <class T>
bool Arbol<T>::etaVacia(){
return arbl == nullptr;
}
template <class T>
void Arbol<T>::inserDato(T& e){
inserDato(arbl, e);
}
template <class T>
void Arbol<T>::borraPos(ablNodo<T>*& pos){
if(pos == nullptr){
throw AblException ("Error de insuficiencia
de datos");
}
if(pos->gethijoIzq() == nullptr && pos>gethijoDer()){
ablNodo<T>*& elPadre = pos->getNodoPadre();
delete pos;
pos = nullptr;
ablNodo<T>*& aux = elPadre;
while (aux != nullptr) {
aux->actualizarPeso();
aux = aux->getNodoPadre();
}

}
else{
ablNodo<T>*& cambiaNodo = getPeso(pos>gethijoIzq());
if(cambiaNodo == nullptr){
cambiaNodo = getMenor(pos>gethijoDer());
}
T sustitulleNodo = cambiaNodo->getDato();
borraPos(cambiaNodo);
pos->setDato(sustitulleNodo);
}
}
template <class T>
void Arbol<T>::borraDato(T& e){
ablNodo<T>*& pos = busDato(e);
if(pos != nullptr){
borraPos(pos);
}
}
template <class T>
void Arbol<T>::imprPreor(){
imprPreor(arbl);
}
template <class T>
void Arbol<T>::imprIno(){
imprIno(arbl);
}
template <class T>
void Arbol<T>::imprPos(){
imprPos(arbl);
}
template <class T>
void Arbol<T>::borraTodo(){
borrarAbl(arbl);
}

template <class T>


int Arbol<T>::getAltura(){
return getAltura(arbl);
}
template <class T>
unsigned Arbol<T>::getPeso(){
return arbl->gethijoIzq()->getPeso();
}
#endif

Menu.h
//
// Menu.h
// Actividad 13
//
// Created by manuel romero on 23/05/14.
// Copyright (c) 2014 manuel romero. All rights
reserved.
//
#ifndef Actividad_13_Menu_h
#define Actividad_13_Menu_h
#include <iostream>
#include <ctime>
#include <cstdlib>
#include "Arbol.h"
using namespace std;
class menu{
public:
void menuArbol( Arbol<int>);
};
void menu::menuArbol( Arbol<int> Arbo){

int dato,i,temp;
srand(time_t(NULL));
cout<< "Introduce el numero de nodos de
enteros"<<endl;
cin>>temp;
if(temp <= 65536){
for(i=0; i<temp; i++){
dato = rand()%65536;
cout<<dato<<"-";
Arbo.inserDato(dato);
}
}else{
cout<<"Exediste el numero de nodos
permitidos"<<endl;
return;
}
cout <<endl<< "Conenido del arbol pre orden "<<
endl;
Arbo.imprPreor();
cout<<endl;
getchar();
cout <<endl<< "Conenido del arbol in orden "<<
endl;
Arbo.imprIno();
cout<<endl;
getchar();
cout <<endl<< "Conenido del arbol pos orden "<<
endl;
Arbo.imprPreor();
cout<<endl;
getchar();
cout<<endl;
cout<<"Altura del arbol: ";

cout<< Arbo.getAltura();
cout<<endl;
}
#endif

Main.cpp
//
// main.cpp
// Actividad 13
//
// Created by manuel romero on 18/05/14.
// Copyright (c) 2014 manuel romero. All rights
reserved.
//
#include <iostream>
#include "Menu.h"
int main()
{
menu me;me.menuArbol(Arbol<int> ());
}

Capturas.

Вам также может понравиться