Version:0.9 StartHTML:0000000105 EndHTML:0000013006 StartFragment:0000000152 EndFragment:0000012972
/******************************************************/
/*************** Isidro Pastor Jorda ******************/
/******************************************************/
/****************** Telematica ************************/
/******************** FPII ****************************/
/****************** Practica 7 ************************/
/******************************************************/
#include <iostream.h>
#include <stdlib.h>
#include <string>
#include "ABB.h"
/*****************************************************************************
* Funcion: ABB
* Descripcion: Constructor de la clase arbol binario de busqueda
*
*
*
* Parametros:
*
* Nombre E/S Descripcion
* ------ ----- -----------
*
*
*
*
* Valor devuelto:
* Inicializa un objeto de la clase arbol binario de busqueda
*****************************************************************************/
ABB::ABB()
{
esvacio = true;
izdo = NULL;
dcho = NULL;
ocur = 0;
};
/*****************************************************************************
* Funcion: Arbol
* Descripcion: Constructor de copia de la clase arbol
*
*
*
* Parametros:
*
* Nombre E/S Descripcion
* ------ ----- -----------
*
*
*
*
* Valor devuelto:
* Hace una copia del objeto de la clase arbol que hace la llamada
*****************************************************************************/
ABB::ABB (ABB &ori)
{
if (!ori.ArbolVacio())
{
izdo = new ABB(ori.HijoIzdo());
dcho = new ABB (ori.HijoDcho());
ori.Informacion(dato, ocur);
esvacio = false;
}
else
{
esvacio = true;
izdo = NULL;
dcho = NULL;
ocur = 0;
}
};
/*****************************************************************************
* Funcion: CopiarABB
* Descripcion: Funcion para realizar una copia de un arbol
*
*
*
* Parametros:
*
* Nombre E/S Descripcion
* ------ ----- -----------
* ori E/S Arbol origen de la copia
*
*
*
* Valor devuelto:
*
*****************************************************************************/
void ABB::CopiarABB(ABB &ori)
{
if (!ori.ArbolVacio())
{
izdo = new ABB(ori.HijoIzdo());
dcho = new ABB(ori.HijoDcho());
ori.Informacion(dato, ocur);
esvacio = false;
}
else
{
esvacio = true;
izdo = NULL;
dcho = NULL;
ocur = 0;
}
};
/*****************************************************************************
* Funcion: ~Arbol
* Descripcion: Destructor de la clase arbol
*
*
*
* Parametros:
*
* Nombre E/S Descripcion
* ------ ----- -----------
*
*
*
*
* Valor devuelto:
* Destruye el objeto de la clase arbol que hace la llamada
*****************************************************************************/
ABB::~ABB()
{
if (!esvacio)
{
delete izdo;
delete dcho;
}
};
/*****************************************************************************
* Funcion: ArbolVacio
* Descripcion: Nos indica si el objeto arbol que hace la llamada esta vacio.
*
*
*
* Parametros:
*
* Nombre E/S Descripcion
* ------ ----- -----------
*
*
*
*
* Valor devuelto:
* True si el objeto arbol esta vacio, false en caso contrario.
*****************************************************************************/
bool ABB::ArbolVacio()
{
return (esvacio);
};
/*****************************************************************************
* Funcion: HijoIzdo
* Descripcion: Devuelve el hijo izquierdo del objeto que hace la llamada.
*
*
* Parametros:
*
* Nombre E/S Descripcion
* ------ ----- -----------
*
*
*
*
* Valor devuelto:
* Objeto de clase arbol.
*****************************************************************************/
ABB & ABB::HijoIzdo()
{
return (*izdo);
};
/*****************************************************************************
* Funcion: HijoDcho
* Descripcion: Devuelve el hijo derecho del objeto que hace la llamada.
*
*
* Parametros:
*
* Nombre E/S Descripcion
* ------ ----- -----------
*
*
*
*
* Valor devuelto:
* Objeto de clase arbol.
*****************************************************************************/
ABB & ABB::HijoDcho()
{
return (*dcho);
};
/*****************************************************************************
* Funcion: Informacion
* Descripcion: Obtiene el dato almacenado en el nodo raiz del objeto
* que hace la llamada.
*
*
* Parametros:
*
* Nombre E/S Descripcion
* ------ ----- -----------
* x E/S Variable donde almacenaremos el Dato del nodo raiz
*
*
*
* Valor devuelto:
* True si existe elemento en el objeto, false en caso contrario.
*****************************************************************************/
bool ABB::Informacion(Valor & x, int &ocurrencias)
{
bool ok;
if(ArbolVacio())
ok = false;
else
{
ok = true;
x = dato;
ocurrencias = ocur;
}
return ok;
};
/*****************************************************************************
* Funcion: Buscar
* Descripcion: Busca un elemento valor en el arbol que hace la llamada.
*
*
* Parametros:
*
* Nombre E/S Descripcion
* ------ ----- -----------
* x E/S Valor que queremos buscar
*
*
*
* Valor devuelto:
* Devuelve el arbol donde esta el elemento buscado en la raiz
*****************************************************************************/
ABB &ABB::Buscar(Valor x)
{
PunteroABB aux;
Valor info;
aux = this;
int trash;
aux -> Informacion(info, trash);
while((!aux -> ArbolVacio()) && (info != x))
{
if(x < info)
aux = & aux -> HijoIzdo();
else
aux = & aux -> HijoDcho();
aux -> Informacion(info,trash);
}
return(*aux);
};
/*****************************************************************************
* Funcion: Insertar
* Descripcion: Inserta un valor en el arbol binario de busqueda que hace la llamada
*
*
* Parametros:
*
* Nombre E/S Descripcion
* ------ ----- -----------
* x E/S Valor que queremos insertar
*
*
*
* Valor devuelto:
* True si hemos conseguido insertar el valor en el arbol
*****************************************************************************/
bool ABB::Insertar(Valor x)
{
PunteroABB aux;
bool ok;
aux = this;
while((!aux -> esvacio) && (x != aux -> dato))
{
if(x < aux -> dato)
aux = aux -> izdo;
else
aux = aux -> dcho;
}
if (x == aux->dato)
{
aux->ocur++;
}
if(aux -> esvacio)
{
aux -> dato = x;
aux -> ocur = 1;
aux -> esvacio = false;
aux -> izdo = new ABB();
aux -> dcho = new ABB();
ok = true;
}
else
ok = false;
return(ok);
};
/*****************************************************************************
* Funcion: Eliminar
* Descripcion: Alimina el elemento del arbol
*
*
* Parametros:
*
* Nombre E/S Descripcion
* ------ ----- -----------
* x E/S Valor que queremos eliminar
*
*
*
* Valor devuelto:
* True si hemos conseguido eliminar el valor en el arbol
*****************************************************************************/
bool ABB::Eliminar(Valor x)
{
PunteroABB aux;
bool ok;
aux = this;
while((!aux -> esvacio) && (x != aux -> dato))
{
if(x < aux -> dato)
aux = aux -> izdo;
else
aux = aux -> dcho;
}
if(aux -> esvacio)
ok = false;
else
{
if((aux -> izdo -> esvacio) && (aux -> dcho -> esvacio))
Borrar0(aux);
else
{
if(aux -> izdo -> esvacio)
Borrar1(aux, aux -> dcho);
else
{
if(aux -> dcho -> esvacio)
Borrar1(aux, aux -> izdo);
else
Borrar2(aux);
}//else
}//else
ok = true;
}//else
return(ok);
};
/*****************************************************************************
* Funcion: Borrar0
* Descripcion: Funcion auxiliar para borrar un caso de arbol
*
*
* Parametros:
*
* Nombre E/S Descripcion
* ------ ----- -----------
* aux E Puntero a arbol que queremos borrar
*
*
*
* Valor devuelto:
* no devuelve nada
*****************************************************************************/
void ABB::Borrar0(PunteroABB aux)
{
aux -> esvacio = true;
delete aux -> izdo;
delete aux -> dcho;
};
/*****************************************************************************
* Funcion: Borrar1
* Descripcion: Funcion auxiliar para borrar un caso de arbol
*
*
* Parametros:
*
* Nombre E/S Descripcion
* ------ ----- -----------
* aux E Puntero a arbol que queremos borrar
* hijo E Puntero a arbol que queremos borrar
*
*
* Valor devuelto:
* no devuelve nada
*****************************************************************************/
void ABB::Borrar1(PunteroABB aux, PunteroABB hijo)
{
*aux = *hijo;
hijo -> esvacio = true;
delete hijo;
};
/*****************************************************************************
* Funcion: Borrar2
* Descripcion: Funcion auxiliar para borrar un caso de arbol
*
*
* Parametros:
*
* Nombre E/S Descripcion
* ------ ----- -----------
* aux E Puntero a arbol que queremos borrar
*
*
*
* Valor devuelto:
* no devuelve nada
*****************************************************************************/
void ABB::Borrar2(PunteroABB aux)
{
PunteroABB sust;
sust = aux -> dcho;
while(!sust -> izdo -> esvacio)
sust = aux -> izdo;
aux -> dato = sust -> dato;
sust -> Eliminar(sust -> dato);
};