Академический Документы
Профессиональный Документы
Культура Документы
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)
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
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;
}
}
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:
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;
}
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);
}
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.