Está en la página 1de 17

Implementaciones de

Arboles Binarios de
Búsqueda (BB)
•Hay 2 formas de implementar un árbol binario
usando distintos recursos del lenguaje de
programación:
• Usar Apuntadores a Memoria
• Usar Arreglos de Registros (Cursor simulando
apuntadores)

Prog. 2 - 2022 1
IMPLEMENTACION DE ARBOLES B.
BUSQUEDA CON APUNTADORES

Objetivo:
1. Los datos son almacenados en la memoria (Nodo-
Arbol). Existe un único Nodo Raíz del Árbol.
2. Es un definición recursiva, cada nodo a su vez se
convierte en raíz de otro sub-arbol.
3. Cada Nodo tiene 2 apuntadores, uno al «hijo
izquierdo» y otro al «hijo derecho».
4. Solo se puede recorrer el árbol desde la raíz hacia
abajo.
5. No existe un apuntador inverso desde los hijos al nodo
padre.
Prog. 2 - 2022 2
IMPLEMENTACION DE ARBOLES B.
BUSQUEDA CON APUNTADORES

unit ArbolesBinariosBusqueda;
Interface
Uses
Tipos, Dialogs, QueuesPointer, StackPointer, SysUtils, Variants;
Const
MAX = 10; // Solo para controlar la cantidad máxima de nodos del árbol
Nulo= Nil; // Indica una posición NO validad del Árbol (rama nula)
Type
PosicionArbol = ^NodoArbol; // Nodo creado por cada apuntador en memoria
NodoArbol = Object
Datos: TipoElemento;
HI, HD: PosicionArbol;
End;

Prog. 2 - 2022 3
IMPLEMENTACION DE ARBOLES B.
BUSQUEDA CON APUNTADORES

Arbol = Object
Private
Raiz: PosicionArbol; // Unica Entrada al Arbol
Q_Items: LongInt; // Cuenta la cantidad de Nodos del Arbol
TDatoDeLaClave: TipoDatosClave;
Size: LongInt;
Public // Rutinas Basicas del Arbol
Function Crear(avTipoClave: TipoDatosClave, alSize: LongInt): Errores;
Function EsVacio(): Boolean; // Sinonimo de arbol vacio
Function EsLleno(): Boolean;
Function RamaNula(P:PosicionArbol): Boolean; // Controla si un apuntador es nil
Function Recuperar(P:PosicionArbol): TipoElemento;
Function PreOrden(): String;
Function InOrden(): String;
Function PostOrden(): String;
Function Anchura(): String;
Function PreOrdenITE(): String;
Function Altura(): Integer;
Function Nivel(Q:PosicionArbol): LongInt;
Function HijoIzquierdo(P:PosicionArbol): PosicionArbol;
Function HijoDerecho(P:PosicionArbol): PosicionArbol;
Function Padre(Hijo:PosicionArbol): PosicionArbol;
Prog. 2 - 2022 4
IMPLEMENTACION DE ARBOLES B.
BUSQUEDA CON APUNTADORES

// Rutina de la Búsqueda Binaria


Function CrearNodo(X:TipoElemento): PosicionArbol;
Function Insertar(X:TipoElemento):Errores;
Function Eliminar(X:TipoElemento):Errores;
Function BusquedaBinaria(X:TipoElemento):PosicionArbol;

Function LlenarClavesRandom(alSize, RangoDesde, RangoHasta: LongInt): Errores;

// Propiedades del arbol


Function CantidadNodos(): LongInt;
Function Root(): PosicionArbol;
Function DatoDeLaClave: TipoDatosClave;
Function SizeTree(): LongInt;
Function MaxSizeTree: LongInt;

// Propiedades de Asignacion al Arbol


Procedure SetRoot(R:PosicionArbol);
Procedure ConectarHI(P:PosicionArbol; Q:PosicionArbol);
Procedure ConectarHD(P:PosicionArbol; Q:PosicionArbol);

End; // Fin de la definicion del Objeto Arbol 5

Prog. 2 - 2022
IMPLEMENTACION DE ARBOLES B.
BUSQUEDA CON APUNTADORES

Descripción de las operaciones del TAD


Function Arbol.Crear(avTipoClave: TipoDatosClave, alSize: LongInt):
Errores;
Objetivo: Inicializar el árbol para dejar en condiciones de ser usado
como árbol vacío.
Function Arbol.EsVacio(): Boolean;
Objetivo: determinar si el árbol esta vacío. Retorna “true” cuando esto
sucede, caso contrario retorna “False”.
Para lograrlo simplemente controla si la Raíz del árbol esta
en “NULO”.
Function Arbol.EsLLeno(): Boolean;
Objetivo: determinar si el árbol esta lleno. Retorna “true” cuando esto
sucede, caso contrario retorna “False”.
Para lograrlo simplemente controla si la cantidad de nodos del
árbol llego al máximo.

Prog. 2 - 2022 6
IMPLEMENTACION DE ARBOLES B.
BUSQUEDA CON APUNTADORES

Descripción de las operaciones del TAD

Function Arbol.RamaNula (P:PosicionArbol): Boolean;


Objetivo: determinar si «P» esta apuntado a nulo. Retorna “true” cuando
esto sucede, caso contrario retorna “False”.

Function Arbol.Recuperar(P:PosicionArbol): TipoElemento;


Objetivo: recupera el dato (tipoelemento) almacenado en el Nodo de la
posición «P» del árbol.

Prog. 2 - 2022 7
IMPLEMENTACION DE ARBOLES B.
BUSQUEDA CON APUNTADORES

Descripción de las operaciones del TAD (Recorridos en profundidad


recursivos)
Function Arbol.PreOrden (): String;
Objetivo: recorre el árbol en «pre-orden» (R,SI,SD) concatenando todos
los elementos del campo «clave» del tipo-elemento. Las ramas
nulas hojas las retorna con un «.» (punto).
Function Arbol.InOrden (): String;
Objetivo: recorre el árbol en «in-orden» (SI,R,SD) concatenando todos
los elementos del campo «clave» del tipo-elemento. Las ramas
nulas hojas las retorna con un «.» (punto).
Function Arbol.PostOrden (): String;
Objetivo: recorre el árbol en «post-orden» (SI,SD,R) concatenando todos
los elementos del campo «clave» del tipo-elemento. Las ramas
nulas hojas las retorna con un «.» (punto).

Prog. 2 - 2022 8
IMPLEMENTACION DE ARBOLES B.
BUSQUEDA CON APUNTADORES

Descripción de las operaciones del TAD (Recorrido en Anchura iterativo)


Function Arbol.Anchura (): String;
Objetivo: recorre el árbol en «anchura» (por niveles de Izquierda a
Derecha) concatenando todos los elementos del campo «clave»
del tipo-elemento.
Para lograrlo utiliza como estructura auxiliar a una cola donde
va almacenando el orden de los nodos a procesar. Se guarda el
puntero de los hijos validos de cada Nodo padre. Se usa el
campo «valor» del tipo-elemento.
Function Arbol.PreOrdenITE (): String;
Objetivo: recorre el árbol en «pre-orden» (R,SI,SD) pero en vez de ser
recursivo lo hace de forma iterativa.
Para lograrlo utiliza como estructura auxiliar a una pila donde
va almacenando los nodos visitados por izquierda para luego
procesar el sub-arbol derecho de cada nodo. Esto simula la
recursivdad del proceso «pre-orden» recursivo.
9
Prog. 2 - 2022
IMPLEMENTACION DE ARBOLES B.
BUSQUEDA CON APUNTADORES

Descripción de las operaciones del TAD (continua)


Function Arbol.Altura (): LongInt;
Objetivo: determina la altura del árbol usando una recorrido básico
«pre-orden» recursivo. Retorna la altura del árbol >= 0 o «0»
en caso de árbol vacío.
Function Arbol.Nivel (Q:PosicionArbol): Integer;
Objetivo: determina el nivel nodo «Q» recibido como parámetro
usando un recorrido básico «pre-orden» recursivo.
Retorna «0» cuando el nodo buscado no existe, caso
contrario retorna el nivel de «Q» > 0. Si «Q» = «raíz» también
va retorna «0».
Function Arbol.Padre (Hijo:PosicionArbol): PosicionArbol;
Objetivo: buscar el padre del parámetro «hijo» dentro del árbol. Si
«hijo» existe retorna la posición (apuntador) del nodo
«padre», caso contrario retorna «nulo».
Para el caso del padre de la «raíz» también retorna «nulo».
10
Prog. 2 - 2022
IMPLEMENTACION DE ARBOLES B.
BUSQUEDA CON APUNTADORES

Descripción de las operaciones del TAD (continua)

Function Arbol.HijoIzquierdo (P:PosicionArbol): PosicionArbol;


Objetivo: Retorna el hijo izquierdo de un nodo recibido como parámetro
«P». Si es «P» es una hoja retorna NULO.

Function Arbol.HijoDerecho (P:PosicionArbol): PosicionArbol;


Objetivo: Retorna el hijo derecho de un nodo recibido como parámetro
«P». Si es «P» es una hoja retorna NULO.

Function Arbol.CrearNodo (X:TipoElemento): PosicionArbol;


Objetivo: Crear un Nodo y asignarle el «X» como dato, «Nulo» a ambos
hijos.
Retorna la dirección (apuntador) del nodo creado.

Prog. 2 - 2022 11
IMPLEMENTACION DE ARBOLES B.
BUSQUEDA CON APUNTADORES

Descripción de las operaciones del TAD (Rutinas de Busqueda Binaria)

Function Arbol.Insertar (X:TipoElemento): Errores;


Objetivo: Insertar una nueva clave en el árbol (nodo hoja) en función a la
«Clave». Si fue posible la inserción retorna «OK». Caso
contrario retorno alguno de los errores posibles.
Las claves duplicadas se insertan en el sub-arbol derecho.

Function Arbol.Eliminar (X:TipoElemento): Errores;


Objetivo: Elimina una clave en el árbol en función a la «Clave». Si
fue posible la eliminación retorna «OK». Caso contrario retorno
alguno de los errores posibles.
En caso de que la clave este duplicada elimina la primer
ocurrencia de la misma.

Prog. 2 - 2022 12
IMPLEMENTACION DE ARBOLES B.
BUSQUEDA CON APUNTADORES

Descripción de las operaciones del TAD (Rutinas de Busqueda Binaria)

Function Arbol.BusquedaBinaria (X:TipoElemento): PosicionArbol;

Objetivo: Buscar una nueva clave en el árbol en función a la «clave».


Si fue posible encontrarla retorna la posición del nodo donde se
encuentra la clave.

Caso contrario retorna «nulo».

Si la clave esta duplicada se retorna la primer ocurrencia de la


misma.

Se debe aplicar el algoritmo de búsqueda binaria en árbol


teniendo en cuenta la relación «SI» < «R» <= «SD».

Prog. 2 - 2022 13
IMPLEMENTACION DE ARBOLES B.
BUSQUEDA CON APUNTADORES

Descripción de las operaciones del TAD (Rutinas Generales)

Function Arbol.LlenarClavesRandom (alSize, RangoDesde, RangoHasta:


LongInt): Errores;
Objetivo: Genera un árbol binario de búsqueda con valores al
azar en la clave del «tipoelemento» según lo especificado
entre el «RangoDesde» y «RangoHasta».

Function Arbol.DatoDeLaClave(): TipoDatosClave;


Objetivo: Retorna el tipo de dato de la clave del «tipoelemento».

Function Arbol.SizeTree(): LongInt;


Objetivo: Retorna el tamaño del árbol creado.

Function Arbol.MaxSizeTree(): LongInt;


Objetivo: Retorna el tamaño Máximo posible para crear el árbol.
14
Prog. 2 - 2022
IMPLEMENTACION DE ARBOLES B.
BUSQUEDA CON APUNTADORES

Descripción de las operaciones del TAD (Propiedades del Arbol)


Function Arbol.CantidadNodos (): LongInt;
Objetivo: Retorna la cantidad de nodos que posee el árbol.
Si el árbol esta vacío retorna «0».
Function Arbol.Root (): PosicionArbol;
Objetivo: Retorna la raíz del árbol o nulo si es vacío.
Procedure Arbol.SetRoot (P: PosicionArbol);
Objetivo: Permite asignar la raíz del árbol con la posición «P».
Procedure Arbol.ConectarHI (P: PosicionArbol; Q: PosicionArbol);
Objetivo: Conecta el Hijo Izquierdo de «P» con «Q».
Procedure Arbol.ConectarHD (P: PosicionArbol; Q: PosicionArbol);
Objetivo: Conecta el Hijo Derecho de «P» con «Q».

Prog. 2 - 2022 15
IMPLEMENTACION DE ARBOLES B.
BUSQUEDA CON CURSORES

unit ArbolesBinariosBusqueda;
Interface
Uses
Tipos, Dialogs, QueuesCursor, StackCursor, SysUtils, Variants;
Const
MIN = 1;
MAX = 10; // Tamaño Máximo del Cursor
Nulo= 0; // Indica una posición NO validad del Árbol (rama nula)
Type
PosicionArbol = LongInt; // Dirección de memoria de un nodo dentro del cursor
NodoArbol = Object
Datos: TipoElemento;
HI, HD: PosicionArbol;
End;

Prog. 2 - 2022 16
IMPLEMENTACION DE ARBOLES B.
BUSQUEDA CON CURSORES

Arbol = Object
Private
Cursor: Array Of NodoArbol;
Raiz, Libre: PosicionArbol; // Unica Entrada al Arbol
Q_Items: LongInt; // Cuenta la cantidad de Nodos del Arbol
TDatoDeLaClave: TipoDatosClave;
Size: LongInt;
Public // Rutinas Basicas del Arbol
Function Crear(avTipoClave: TipoDatosClave, alSize: LongInt): Errores;
Function EsVacio(): Boolean; // Sinónimo de árbol vacío
Function EsLleno(): Boolean;
Function RamaNula(P:PosicionArbol): Boolean; // Controla si un apuntador es nulo
Function Recuperar(P:PosicionArbol): TipoElemento;
Function PreOrden(): String;
Function InOrden(): String;
Function PostOrden(): String;
Function Anchura(): String;
Function PreOrdenITE(): String;
Function Altura(): Integer;
Function Nivel(Q:PosicionArbol): LongInt;

// Ídem al resto de las operaciones del TAD de apuntadores


17
Prog. 2 - 2022

También podría gustarte