Está en la página 1de 29

Carátula para entrega de prácticas

Facultad de Ingeniería Laboratorio de docencia

Laboratorios de computación
salas A y B
Profesor: M.I Edgar Tista García

Asignatura: Estructura de datos y algoritmos II

Grupo: 07

No de Práctica(s): 08-09 - Árboles

Integrante(s): Isidro Castro Karen Cristina

No. de Equipo de
cómputo empleado: 1

No. de Lista o Brigada:

Semestre: 2023-1

Fecha de entrega: 30 de octubre de 2022

Observaciones:

CALIFICACIÓN: __________
Objetivos
Objetivo: el estudiante conocerá e identificará las características de la estructura no-lineal árbol (árbol binario,
binario de búsqueda y Árbol-B)

Objetivo de clase: el alumno analizará las implementaciones proporcionadas y conocerá la forma en la que se
pueden implementar estas estructuras de datos
Desarrollo
Ejercicio 1. Implementación de un árbol Binario

Revisa la implementación proporcionada de un árbol binario, en dicha implementación se define el árbol binario
con las operaciones de agregar nodo e imprimirlo a través de su recorrido en BFS

a) Realiza un análisis de la implementación anterior, incluyendo los comentarios que te parezcan relevantes
acerca de los elementos que integran las clases.

Clase ArbolBin

ArbolBin tiene un atributo llamado root de tipo Nodo, este atributo como su nombre lo indica corresponde
a la raíz de un árbol el cual es el elemento esencial para que un árbol exista, por lo que enseguida se
encuentra el constructor donde a root se le asignara el valor de null, lo que significa que no tiene hijos y
no tiene un valor, después se encuentra el constructor el cual a diferencia del anterior si le creara lazos a
la raíz por lo que este constructor recibirá un valor de tipo entero llamado value, en este constructor a root
se le asigna el valor de crear un nuevo nodo, por lo que la clase nodo se encuentra compuesta por un valor
de tipo entero llamado valor, un nodo llamado izquierdo y un nodo llamado derecho, con el constructor a
la raíz se le asignara un valor pero aún no tendrá hijos.

El siguiente método es “add” que como su nombre lo indica agregara un nuevo nodo por lo que recibirá
un Nnodo llamado padre, un Nodo llamado hijo y un entero llamado lado, dentro se evalúa que lado sea
igual cero lo que indica que se deberá guardar del lado izquierdo del árbol, esto implica que se haga uso
del método de la clase nodo llamado setIzq del objeto padre, a este se le enviara “hijo”; en caso contrario
se usara el método setDer de “padre” y s ele enviara de igual forma “hijo”.

El siguiente método es visit este método está protegido por lo que solo tendrá acceso a ella la misma clase
o sus derivados, recibir un Nodo bajo el nombre de “n” y dentro del método se imprimir el valor de dicho
nodo más un espacio.

El último método de ArbolBin es breadthFirst este método pretende visitar o hacer un recorrido del árbol
el método es público y no recibe ningún valor; dentro se declara un nuevo nodo llamado r el cual está
asociado a la raíz del árbol, también se declara una Queue de Nodos llamada “queue” que será de una
LinkedList, después con un if se comprobara que r (la raíz) no sea nula lo que significara que existe dicho
árbol y que al menos contendrá un valor, si es cierto entonces a queue se agregara este nodo r, después
scon un ciclo while que se ejecutara mientras queue no este vacía a r se le asignara el valor casteado al
Nodo devuelto por devolver y eliminar el primer valor de queue (desencolar), se llamara al método visitados
(para mostrar el valor), enseguida se evaluara con un if que el atributo “izq.” del nodo “r” no sea nulo (lo
que significa que existe un subárbol izquierdo o al menos un nodo en el subárbol izquierdo), si dicho
atributo no es nulo entonces se agregara este valor a queue; después con un if ahora se evaluara que el
valor del atributo “der” del nodo “r” si es así entonces se agregara a queue dicho nodo; en esencia este
método comienza agregando el nodo raíz a una queue, posteriormente agregara el nodo inmediato
izquierdo y derecho, en cada iteración obtendrá un nodo y agregara sus nodos derecho e izquierdo.
Ilustración 1 Representación del recorrido del método breadthFrist

Clase Nodo

La clase nodo tiene como atributos a un valor de tipo entero llamado valor, un nodo llamado izquierdo
inicializado con null y un nodo llamado derecho igualmente inicializado con null, Enseguida se encuentra
el primer constructor donde solo se declara que el valor de sus hijo der e izq. son nulos, el siguiente
constructor recibirá un valor entero llamado data después al atributo “valor” se le asignara el valor d data ,
y a der e izq. se le asignara null lo que significa que a pesar de que el nodo ya tiene un valor aún no tiene
hijos. Después se encuentra otro constructor para además de darle un valor al nodo también se le
asignaran un par de nodos hijos, por lo que este método recibe como valores un entero llamado data , un
Nodo llamado “la”, y otro Nodo llamado “rt”, al atributo valor de un Nodo se le asignara el valor de data, al
nodo Izq se le asignara el Nodo lo y al Nodo der s ele asigna el Nodo rt.

También se encuentra un método llamado setIzq el cual modificara el nodo descendiente izquierdo del
nodo de interés, por lo que recibirá un Nodo llamado izq, y al atributo izq del nodo de interés se le asignara
este nuevo nodo enviado. Además, se encuentra un método llamado setDer el cual modificara el nodo
descendiente derecho del nodo de interés, por lo que recibirá un Nodo llamado der, y al atributo der del
nodo de interés se le asignara este nuevo nodo enviado.

b) Ejecuta la clase prueba e indica los aspectos que te llamen la atención, dibuja (a mano) el árbol que se
realiza en la clase principal.

Me pareció interesante que al agregar un nuevo nodo al árbol binario se tiene el control de agregarlo del
lado derecho o izquierdo, pienso que si se tratara de implementar en un programa con mayor
complejidad podría resultar un problema ya que como sabemos en un árbol binario todo lo que se
encuentra al lado derecho es mayor que la raíz, y todo lo que se encuentra del lado izquierdo es menor,
sin embargo se tiene un control externo sobre dónde colocar cada nuevo nodo por lo que si no se es lo
suficientemente cuidadoso se podría tener un árbol binario que no cumpla las características
previamente mencionadas.
Ilustración 2 Captura de ejecución del programa pruebas, donde se observa el recorrido realizado por breadthFrist

Ilustración 3 Dibujo a mano del grafo en el programa pruebas


Figure 1 Dibujo a mano del grafo en el programa pruebas

c) Crea un segundo árbol (dibújalo primero en papel y luego en el programa) e indica una captura en tu
reporte (de la versión a mano y de la salida del programa). Indica las ventajas/desventajas de crear el
árbol con la implementación proporcionada.

Ilustración 4 Dibujo (a mano) del grafo que será programado en la clase pruebas
Ilustración 5 Captura de ejecución del recorrido del grafo anterior ingresado
d) Agrega un método para agregar la eliminación (en un árbol binario cualquiera, para la eliminación de un
nodo se reemplaza con cualquiera de sus hijos, el objetivo es que no se pierdan los subárboles del nodo
eliminado (verifica el funcionamiento de tu método en la clase prueba)

La eliminación de un nodo se encuentra conformada por dos métodos, eliminar y hojaMasIzq

El método eliminación es de tipo public void y recibe dos valores, un entero llamado clave la cual representa
al valor que se quiere eliminar, también recibe un Nodo llamado raíz, dentro se declara un Nodo llamado r
el cual es inicializado con raíz, también se crean dos nuevos nodos, uno llamado Auxiliar y otro Intercambio,
enseguida se evalúa que al menos el nodo der o izq del nodo no sean null (lo que significara que el árbol
no tiene un único nodo que es la raíz), si se cumple entonces se evalúa que el valor de r sea el mismo que
el que se quiere eliminar si cumple entonces a intercambio se le asigna el valor que retorna el método
hojaMasIzq al cual se le envía el nodo r, después al valor de r se le asigna el mismo valor que el del nodo
der de intercambio, después a auxiliar en el nodo der se le asigna el nodo izq del nodo der de Intercambio,
después a Intercambio en el nodo der se le asigna el nodo der de auxiliar, si clave no es igual al valor de r
entonces se evalúa que la clave sea menor a r y que el nodo izq de r no sea null, si cumple entonces se
evalúa que el valor del nodo izq de r sea el mismo que se quiere eliminar y que el nodo izq de izq de r sea
null si es correcto entonces al nodo izq de r se le asigna null, si no cumplió entonces se llama a eliminar y
se le pasa clave y el nodo izq de r. Si la clave no fue menor significa que la calve es mayor a r por lo que
se evalúa que el valor del nodo der de r sea igual a clave, y que el nodo izq y der de izq de r sean nulos (es
un nodo hoja) si cumple entonces al nodo der de r se le asigna null. Si no cumple entonces se llama a
eliminar y se le envía la clave y el nodo der de r. Si no se cumplió que alguno de los nodos de r no sea null
entonces solo existe la raíz y si es igual a la clave a root se le asigna null.

El método hojaMasIzq es de tipo public Nodo y recibe un nodo llamado r, dentro se evalúa que el nodo izq
de r no sea null si es cierto entonces se evalúa que el nodo der de izq de r no sea null, si cumple entonces
a r se le asigna el nodo izq de r y se ejecuta un ciclo while mientras el nodo der de der no sea null dentro
a r se le asignara el nodo der de r, si no se cumplió que el nodo izq de r no sea null entonces se evaluara
que el nodo der de r no sea null si cumple entonces se evalúa que el nodo izq de der de r no sea null, si
cumple entonces a r se le asigna el nodo der de r y se ejecutara un ciclo while mientras el nodo izq de izq
de r no sea null, dentro a r se le asignara el nodo izq de r. Finalmente se retornara a r.
Ilustración 6 Capturas de ejecución de la eliminación de tres claves, al inicio se muestra la lista original, después
cada valor que se elimina y como queda la lista después de dicha eliminación
e) Agrega el método para realizar la búsqueda de un valor en los nodos. Esta búsqueda debe devolver “si o
no” si el dato se encuentra en el árbol ¿Qué otros datos podrían ser de interés en la búsqueda de un valor
en un árbol? Verifica el funcionamiento de tu método en la clase prueba)

En la clase ArbolBin se creó un nuevo método llamado buscar el cual es de tipo String y recibe dos
valores los cuales son un entero llamado value que representa al valor a buscar y un Nodo llamado raíz.
Dentro se declara un Nodo llamado r y esta inicializado con raíz, después se declara un String llamado
retornar inicializado con “No” después con un if se evalúa que el valor buscado sea igual al valor de “r”,
valor de la raíz si es correcto entonces retornara si, en cambio si no es el mismo valor con un if se
evaluara que sea menos al valor de r si es así entonces se evaluara que el nodo izq de r no sea null si es
correcto entonces retornaremos el valor de auto llamar al método buscar al cual se le mandara el valor a
buscar y el nodo izq de r, en cambio si el nodo izq de r si era null entonces se retornara el valor de
retornar de donde si al final de todas las llamadas recursivas el valor si se encontraba entonces retornara
“Si” pero si no se encontró entonces no se actualizo y regresara “No”; por otra parte si el valor buscado
no era menor al valor de r entonces se evaluara que el nodo der de r sea diferente de null si es así
entonces a retornar se le asignara el valor que retorne la llamada a buscar a la cual se le mandara el
valor buscado y el nodo der de r. Al final se retornará la variable retornar
Ilustración 7 Captura de ejecución del método buscar, primero se observa el árbol sobre el cual se hará la búsqueda
y enseguida se coloca el valor que se buscaba y cuál fue el resultado.
Ejercicio 2.- Operaciones de un árbol binario

a) Agrega un método para obtener la notación Prefija de un árbol binario (preorden)

Se agrego un nuevo método llamado preOrden a la clase ArbolBin, este método es de tipo public void,
recibirá un nodo llamado raíz, dentro se declara un nuevo Nodo llamado r el cual es inicializado con raíz,
enseguida se llama al método visit y se le mandara el nodo r, después con un if se evalúa que el nodo izq
de r no sea null si es correcto entonces se llamara al método preOrden al cual se le mandara el nodo izq
de r, al final de estas llamadas recursivas se regresara al primer método y se proseguirá a evaluar con un
if que el nodo der sea distinto de null, si es cierto entonces se llamara al método preOrden al cual se la
mandara el nodo der de r.

Ilustración 8 Captura de ejecución del recorrido preOrden primero se muestra el arbol por BFS y después el de
preOrden
b) Agrega un método para obtener la notación Infija de un árbol binario (inorden)

Se agrego un nuevo método llamado inOrden a la clase ArbolBin, este método es de tipo public void,
recibirá un nodo llamado raíz, dentro se declara un nuevo Nodo llamado r el cual es inicializado con raíz,
después con un if se evalúa que el nodo izq de r no sea null si es correcto entonces se llamara al método
preOrden al cual se le mandara el nodo izq de r, en cada llamada recursiva cuando llegue al último nodo
del lado izquierdo del árbol entonces se llamara al método visit y se le mandara el nodo r, al regresar de
todas estas llamadas, se proseguirá a evaluar con un if que el nodo der sea distinto de null, si es cierto
entonces se llamara al método in Orden al cual se la mandara el nodo der de r.
Ilustración 9 Captura de ejecución del recorrido InOrden
c) Agrega un método para obtener la notación Posfija de un árbol binario (postorden) Realiza la prueba de tu
programa con los árboles realizados en el ejercicio de clase e incluye una captura de pantalla con las
salidas de los recorridos.

Se agrego un nuevo método llamado postOrden a la clase ArbolBin, este método es de tipo public void,
recibirá un nodo llamado raíz, dentro se declara un nuevo Nodo llamado r el cual es inicializado con raíz,
después con un if se evalúa que el nodo izq de r no sea null si es correcto entonces se llamara al método
postOrden al cual se le mandara el nodo izq de r, se proseguirá a evaluar con un if que el nodo der sea
distinto de null, si es cierto entonces se llamara al método in Orden al cual se la mandara el nodo der de r,
finalmente se llamará al método visit y s ele mandara el nodo r.

Ilustración 10 Captura de ejecución del recorrido en Postorden


Ejercicio 3.- Árbol binario de búsqueda.

Crea una nueva clase llamada ArbolBinBusq, que herede de la clase del ejercicio 1, la diferencia es que deberás
sobre escribir las operaciones de inserción y eliminación basado en las reglas de un árbol binario de búsqueda.

Crea un árbol binario de búsqueda de al menos 10 nodos para probar tu implementación (incluye una captura de
pantalla del árbol en tu reporte)

Se creo una nueva clase llamada ArbolBinBusq y se heredó con la instrucción extends

Ilustración 11 Captura de la instrucción para incorporar la herenica.

Agregar

Este método es public void, recibe dos valores uno es un entero el cual se llama value y representa al valor a
agregar, también recibe un Nodo llamado raíz, dentro se declara un nuevo nodo llamado r el cual fue inicializado
con raíz, también se declara un Nodo llamado auxiliar al cual se llama a su constructor y se le manda el valor a
agregar, con un if se evalúa que r sea null si es cierto entonces solo se le asignara a root el nodo auxiliar pero si r
no es null entonces se evalúa que value sea menor al valor de r si es cierto entonces con un if se evaluara que el
nodo izq de r sea null si es así entonces izq se le asignara auxiliar, si el nodo izq de r no era null entonces se
llamara al método add al cual se le pasara el valor a agregar y el nodo izq de r para ahora buscar la posición donde
agregar el valor a partir del nodo izq de r. Pero si el valor no fue menor al valor de r entonces se evalua que value
sea mayor al valor de r si es cierto entonces con un if se evaluara que el nodo der de r sea null si es así entonces
a der se le asignara auxiliar, si el nodo der de r no era null entonces se llamara al método add al cual se le pasara
el valor a agregar y el nodo der de r para ahora buscar la posición donde agregar el valor a partir del nodo der de
r.

<

Ilustración 12 Captura de ejecución del árbol con recorrido BFS después de agregar todos los datos.
Eliminar

El método eliminación es de tipo public void y recibe dos valores, un entero llamado clave la cual representa
al valor que se quiere eliminar, también recibe un Nodo llamado raíz, dentro se declara un Nodo llamado r
el cual es inicializado con raíz, también se crean dos nuevos nodos, uno llamado Auxiliar y otro Intercambio,
enseguida se evalúa que al menos el nodo der o izq del nodo no sean null (lo que significara que el árbol
no tiene un único nodo que es la raíz), si se cumple entonces se evalúa que el valor de r sea el mismo que
el que se quiere eliminar si cumple entonces a intercambio se le asigna el valor que retorna el método
hojaMasIzq al cual se le envía el nodo r, después al valor de r se le asigna el mismo valor que el del nodo
der de intercambio, después a auxiliar en el nodo der se le asigna el nodo izq del nodo der de Intercambio,
después a Intercambio en el nodo der se le asigna el nodo der de auxiliar, si clave no es igual al valor de r
entonces se evalúa que la clave sea menor a r y que el nodo izq de r no sea null, si cumple entonces se
evalúa que el valor del nodo izq de r sea el mismo que se quiere eliminar y que el nodo izq de izq de r sea
null si es correcto entonces al nodo izq de r se le asigna null, si no cumplió entonces se llama a eliminar y
se le pasa clave y el nodo izq de r. Si la clave no fue menor significa que la calve es mayor a r por lo que
se evalúa que el valor del nodo der de r sea igual a clave, y que el nodo izq y der de izq de r sean nulos (es
un nodo hoja) si cumple entonces al nodo der de r se le asigna null. Si no cumple entonces se llama a
eliminar y se le envía la clave y el nodo der de r. Si no se cumplió que alguno de los nodos de r no sea null
entonces solo existe la raíz y si es igual a la clave a root se le asigna null.

El método hojaMasIzq es de tipo public Nodo y recibe un nodo llamado r, dentro se evalúa que el nodo izq
de r no sea null si es cierto entonces se evalúa que el nodo der de izq de r no sea null, si cumple entonces
a r se le asigna el nodo izq de r y se ejecuta un ciclo while mientras el nodo der de der no sea null dentro
a r se le asignara el nodo der de r, si no se cumplió que el nodo izq de r no sea null entonces se evaluara
que el nodo der de r no sea null si cumple entonces se evalúa que el nodo izq de der de r no sea null, si
cumple entonces a r se le asigna el nodo der de r y se ejecutara un ciclo while mientras el nodo izq de izq
de r no sea null, dentro a r se le asignara el nodo izq de r. Finalmente se retornara a r.

Ilustración 13 Capturas de ejecución de la eliminación de tres claves, al inicio se muestra la lista original, después
cada valor que se elimina y como queda la lista después de dicha eliminación
Ejercicio 4.- Menú de usuario

Agrega una clase para elaborar un menú en el que el usuario pueda elegir entre trabajar en árboles binarios y
árboles binarios de búsqueda. Las opciones para el usuario deberán ser las siguientes:

1.- Arboles binarios

1. Crear árbol

2. Agregar dato

3. Eliminar dato

4. imprimir árbol (BFS)

5. Notación Prefija (preorden)

6. Notación Infija (inorden)

7. Notación Postfija (postorden)

2.- Árboles Binarios de búsqueda

1. Crear árbol

2. Agregar dato

3. Eliminar dato

4. Buscar

5. Imprimir árbol (BFS)

Se creo una nueva clase llamada MenuArbolesBin, dentro contiene tres métodos el primero es menú, el siguiente
es menuAB y el ultimo se llama menuABB

El primer método llamado menú es de tipo public static void y no recibe valores, dentro se declara un nuevo scanner
bajo el nombre de input , también se declara un entero llamado opción, un boolean llamado salir inicializado con
false, enseguida se ejecuta un ciclo while mientras salir sea false, dentro se muestra el menú y las opciones las
cuáles son: Arboles Binarios, Arboles Binarios de búsqueda y salir, enseguida se guarda la opción dada por el
usuario en opción usando a input, enseguida se ejecuta un switch con opción, si se elige el caso 1 correspondiente
a Arboles binarios entonces se llama al método menuAB, pero si se elige el caso 2 correspondiente a árboles
binario de búsqueda entonces se llama al método menuABB, finalmente si se elige el tercer caso entonces a la
variable salir e le asigna el valor de true.

El método menuAB es private static void y no recibe valores, dentro se declara un ArbolBin llamado árbol, un
scanner llamado input, un entero llamado opción y un booleano llamado salir, enseguida se ejecuta un ciclo while
mientras el valor de salir sea false , enseguida se muestra el menú el cual está compuesto por crear árbol, agregar
dato, eliminar dato, imprimir árbol (BFS), notación Prefija (preorden) 6. Notación Infija (inorden) 7. Notación
Postfija (postorden), enseguida se guarda la opción dada por el usuario en opción usando a input, enseguida se
ejecuta un switch con opción, si se elige el caso 1se le pedirá al usuario el valor de la raíz y con este se llamara al
constructor de árbol, si se elige el caso 2 entonces se le pedirá al usuario dar el valor del nodo hijo, el cual se le
mandara al constructor de un nuevo nodo llamado hijo, después se le pedirá al usuario dar el valor del nodo padre,
el cual se le mandara como parámetro al método buscarPadre, el cual retornara un valor que se guardara en un
nuevo Nodo llamado padre, enseguida se le pide dar el lado en el que se agregara el valor, para finalmente pasarle
estos tres valores a al método add de árbol. Si se elige el caso 3se le pedirá al usuario dar el dato a eliminar y se
le mandará este dato al método eliminar del árbol., para el caso 4 se llama al método breadthFrist, en el caso 5 se
llama al método preOrden , para el caso 6 se llama al método inOrden, en el caso 7 se llama al método postOrden
y apara el caso 8 a salir se le asigna el valor de true.

El método menuABB es private static void y no recibe valores, dentro se declara un ArbolBinBusq llamado árbol,
un scanner llamado input, un entero llamado opción y un booleano llamado salir, enseguida se ejecuta un ciclo
while mientras el valor de salir sea false , enseguida se muestra el menú el cual está compuesto por Crear árbol,
Agregar dato, Eliminar dato, Buscar, Imprimir árbol (BFS) ), enseguida se guarda la opción dada por el usuario en
opción usando a input, enseguida se ejecuta un switch con opción, si se elige el caso 1 se llama al constructor de
árbol, si se elige l caso 2 entonces se le pide al usuario dar el número a ingresar y este se le envía al método add
del aArbolBinBusq, si por otro lado se elige el caso 3 entonces se le pide al usuario dar el numero a eliminar y este
junto a la raíz del árbol se le son enviados al método, si se elige el caso 5 solo se llama al método breadthFrist y
por ultimo si se elige el caso 6 a la variable salir se le asigna el valor de true

Menú principal

Ilustración 14 Captura de ejecución del menu principal


Menú Arboles Binarios

Ilustración 15 Capturas de ejecución del funcionamiento del menu arboles binarios


Ilustración 16 captura de ejecucion del menu ArbolBinario particularmente en la parte de crear y agregar nodos
Ilustración 17 Captura de ejecución del menu Arboles Binarios, se logra observr la eliminacion d eun nodo.
Ilustración 18 Capturas de ejecucion del emnu arboles Binarios donde se observan los distintos recorridos de un arbol
Menú arboles Binarios de Búsqueda

Ilustración 19 Captura d ejecución del menú arboles binarios de búsqueda donde se observa cómo se agregan ciertos
valores
Ilustración 20 Captura d ejecución del menú arboles binarios de búsqueda donde se observa cómo se agregan ciertos
valores y su recorrido
Ilustración 21 Captura d ejecución del menú arboles binarios de búsqueda donde se observa cómo se eliminan
ciertos valores y como queda el bosque después de estos
Ejercicio 5.- Árbol B

Realiza un análisis detallado de la implementación de árbol B proporcionada

• En el reporte de la práctica explica los atributos y los métodos de las dos clases proporcionadas

• En caso de ser necesario puedes modificar las variables del programa o hacer ajustes que te permitan
comprenderlo de mejor manera

BNode

La clase BNode tiene como atributos a un static int llamado m, una ArrayList de enteros llamada key, otra ArrayList
de Bnode llamada child, también tiene un Bnode llamado parent y un boolean llamado leef, enseguida se encuentra
el constructor, en este a key se le dará una nueva lista, lo mismo para child, por otra parte, a leaf se le asignará el
valor de true y a parent el valor de null.

Se encuentra un método llamado getKey el cual es de tipo BNode public recibe un entero llamado i que representa
la posición de la clave que se quiere, por lo tanto, este método retornara el BNode que se encuentra en key en la
posición de i. El siguiente método es getChild, este es de tipoBnode public y recibe un valor llamado entero llamado
i el cual representa la posicion del hijo que se quiere, dentro se encuentra la instrucción parea obtener el valor de
child en la posición de i , esta instrucción se encuentra rodeada por un try-catch en caso de que no se encuentra
el valor, no exista dicha posición o cualquier otra excepción que pueda ocurrir, y una de estas ocurre entonces solo
se retornara un valor null en caso contrario entonces se retornara el valor en la posición de i.

El siguiente método es set el cual, y se tipo public void y recibe un valor entero llamado m , este valor se le asignara
al atributo m. Después se encuentra el método para modificar a key, este método es de tipo public void y recibe
un ArrayListr de enteros, dentro a key se le asignara esta lista. El siguiente método es para modificar a chil, el
método se llama setChildren , este método es de tipo public void y recibe un ArrayListr de enteros, dentro a child
se le asignara esta lista.

El método getChildIndex es de tipo public int y no recibe valore, dentro se evalua que parent sea null (no tiene
hijos) si es correcto entonces se retornará un -1, pero si no lo es entonces se declara un nuevo BNode llamado
padre al cual se le asigna el valor de parent, después con un ciclo for desde 0 hasta el tamaño de la lista de hijos
de padre se va a evaluar que child de padre en la posición de i sea this, si es así entonces se retornara i, pero si
se termina de iterar y en ningún momento child en alguna posición fue this entonces se retornara -1. El ultimo
método es mostrar llaves, este método es de tipo public void y no recibe valores, dentro se ejecutará un ciclo for
que empieza en cero y hasta que el contador de igual o mayor al tamaño de la lista de key, dentro se mostrará
cada valor de key más un espacio.

BTree

La clase BTree tiene dos atributos, esos son un entero llamado m y un BNode llamado root, enseguida se encuentra
se encuentra el constructor el cual recibe un valor de tipo entero llamado m, , a m se le asignará este entero, a
root se le dará un nuevo Bnode y además se modificará el valor de m del nodo root. Elx siguiente método es add,
este recibe un enero llamado n el cual es el valor para agregar, dentro si el valor devuelto por el método find al
cual se le envía n es true entonces de mostrar que la clave ya existe, pero si es false entonces se crea un BNode
llamado hoja al cual se le asigna el valor del método leafNode al que se le envía el valor de root y n.

El siguiente método es leafNode el cual es de tipo private BNode y recibirá un BNode llamado node y un entero
llamado n, dentro con un if se evalua que el valor del atributo leaf de nodo sea true si es así entonces retornara al
nodo, pero si no lo es entonces se declara un entero llamado i inicializado con cero, después se ejecuta un ciclo
for hasta que i sea igual o mayor al tamaño de key, dentro con un if se evalua que n sea menos al valor del atributo
key de nodo en i, dentro a i se la agrega un valor, y se rompe el ciclo, fuera del for con un if se evalua que le valor
de n sea menor al valor de key del nodo en la posición de i-1, si es cierto entonces a i se le resta uno, finalmente
se retorna el valor de leafNode al cual se le envió el valor de child de nodo en la posición de i y el valor de n.

El siguiente método es addToNode el cual es de tipo private void el cual recibe un BNode llamado node y un valor
entero llamado n, dentro se evalua que el tamaño de la lista key sea menor al valor del atributo m -1, si es así
entonces se mostrará el tamaño de la lista key y se llamará al método insert al cual se le enviaran nodo y n, sin
embargo, si no fue menor entonces se llama al método fusión celular al cual se le envían nodo y n.

El siguiente método es insert, es de tipo private void y recibe un BNode llamado nodo y un entero llamado n, dentro
se declara una variable entera llamada i la cual es inicializada con cero, enseguida se ejecuta un ciclo while
mientras i sea menor que el tamaño de la lista key y además que n sea mayor que el valor de la lista key de nodo
en la posición e i, dentro a i se le sumará 1, fuera del ciclo while a nodo en la lista jkey s ele agrega el valor de i en
la posicion de n.

El siguiente método es divisionCelular la cual es de tipo private void y recibe un BNode llamado nodo y un entero
llmaod n, dentro se declara una variable entera llamada h inicializada con el valor del atributo m-1 y eso entre dos,
enseguida se evalua que el módulo del atributo m sea distinto de 2 (no sea par) si es así entonces se llama a insert
y se le envina nodo y n, fuera del if se declara una variable entera llamada medio inicializada con el valor de la lista
key en la posición de h, después se declara una nueva lista llama key1 a la cual se le asignara el valor devuelto
por el método sublist de key de nodo, desde la posición 0 y hasta la posición de h, se declaró otra lista llamada
key2 la cual contendrá los valores desde h+1 y hasta el valor de h por dos y más uno, también se crean otras dos
listas llamadas child1 y child2. Después con un if se evalua que el valor de nodo sea igual que la raíz si es así
entonces se declaran dos nuevos nodos llamados nuevoNodo1 y nuevoNodo2, además al atributo leaf de estos
nuevos nodos se les asigna el valor de leaf de nodo, después se modifica el valor de ley de nuevoNodo1,se le dará
el valor de key1. Esto mismo sucede con Nodo2, después se limpia la lista de key de nodo y además se le agrega
a key el valor de medio.

Después con un if se evalua que el módulo d entre dos sea cero (sea par), si es cierto entonces con un if se evalua
que n sea menor a medio , si es cierto entonces se llama al método insert y s ele envían los valores de nuevoNodo1
y n. pero si n no fue menor que medio entonces se llama al métodoInsert al cuál se le encina nuevoNodo2 y n.

Después scon un if se evalua que el valor de leaf de nodo sea false, si es así entonces se evalúa que el módulo de
m entre dos no sea 0, después a child1 se le asigna una nueva sablista desde 0 hasta h+1, después a child2 se le
asigna la sublista desde h+1 y hasta n+1. Pero si el valor d em modulo 2 fue 0 entonces se evalua que n sea menor
a medio, si es así entonces child1 se le asigna la sublista desde 0 y hasta h+1, ya a child2 se le signa la sublista
desde h+2 y hasta m+1, pero si n es mayor a m entonces si es así entonces child1 se le asigna la sublista desde
0 y hasta h+1, ya a child2 se le asigna la sublista desde h+2 y hasta m+1

Fuera de este él se entonces a nuevoChil se le agrega el valor de child1, y a nuevoNodo2 se le agrego el valor de
child2, después scon un ciclo for que se interara mientras la lista child tengan lugares, entonces a i ,parent se le
asignará el nuevoNodo1, después con otro ciclo for que se ejecutara igualmimetras existan elementos en child al
padre de i se le asignará el valor de nuevo nodo2

. después se limpia la lista child y se le agrega nuevoNodo1 y nuevoNodo2, y al atributo parent de nuevoNodo1 y
nuevoNodo2 s ele asigna el valor de root, después a leaf de nodo se le asigna el valor de false. Pero si nodo no era
igual a root entonces se declara un nuevo BNode llamado nuevoNodo, y a leaf de nuevoNodo se le asigna el valor
de leaf de nodo, además a paren de nuevoNodo se le asigna el valor de parent de nodo, además se declara un
entero llamado children al cual se le asigna le valor de getChildrenIndex de nodo, después a nodo se le agrega
key1 y a nuevoNodo se le agrega jey2, después scon un if se evalua que m sea par si es si entonces se evalua que
n sea menor a medio si es correcto entonces se llama al método insert y s ele envía modo y n, si no fue cierto
entonces se llama a insert y s ele envía nuevoNodo y n. Después con un if se evalua que el valor de leaf de nodo
sea false, si es cierto entonces se evaluara que m sea impar si es cierto entonces a child1 se le asigna una nueva
sublista desde 0 hasta h+1, después a child2 se le asigna la sublista desde h+1 y hasta m+1. Pero si no fue impar
entonces se evalua que n sea menor a medio, si es así entonces child1 se le asigna la sublista desde 0 y hasta
h+2, y a child2 se le signa la sublista desde h+2 y hasta m+1, pero si n es mayor a medio entonces a child1 se le
asigna la sublista desde 0 y hasta h+1, y a child2 se le asigna la sublista desde h+1 y hasta m+1, fuera a nodo se
le cambia child por child1 y a nuevoNodo se le cambia por child2, scon un ciclo for que se interara mientras la
lista child tengan lugares, entonces a i ,parent se le asignara v el nuevoNodo1, después con otro ciclo for que se
ejecutara mientras existan elementos en child al padre de i se le asigan el valor de nuevo nodo, Fuera de todos los
if se le agrega child de parent de nodo chidIndex +1 y nuevoNodo. Y se agrega parent de nodo en l posición de
medio,

El siguiente método es mostrar árbol con un if evalua que child y key de root estén vacíos si es así entonces s e
mostrara no hay elemento, pero de lo contrario entonces se declara una Queue de BNode llamado nodos, a este
se le agregara root, también declara un BNode llamado parent inicializado con null, después mientras nodos no
este vacía se ejecutara un ciclo while, donde dentro se declara un BNode llamado v el cual siete el valor
desencolado de nodos, después con un if se evalua que parent de v sea null, si es cierto entonces se imprimirá
nodo raíz, después con un if se evalua que parent sea distinto del valor parent de v, si es cierto entonces se muestra
Nodo Padre y se llama al método mostrarllaves, y a parent se le asigna el valor de parent de v.Después fuera del
if se llama al método mostrarLlaves, despue scon un ciclo for que se repetirá mientras i sea menor que el tamaño
de child, dentro se le agrega el valor de child en la posicion de i.

El siguiente método es find, devuelve un valor boolean y rebibe un valor entero, dentro se evalua que child de
root no este vacía y que la lista de claves no este vacía, si es cierto entonces se retornara false , pero si no lo fue
entonces se retornara el valor devuelto por find a la cual y envió el value y root sí. El siguiente es find , este método
también es boolean, pero recibe como valores un valor entero y un BNode n, dentro se evalua que n sea null si lo
es entonces retornara false, pero si no lo es entonces se declara una variable entera llamada i, después se evalua
que el valor de ey d en en la posición de 0sea mayor a cero, después con un cicló for que empieza en cero y se
ejecutara hasta que el contador igual o mayor que le también de la esta key, dentro con un if se evalua que get
key den sea igual a v si es cierto entonces se retornara true, pero si no fue cierto entonces con un if se evalua que
el valor key de n en i sea menor a v y que su consecutivo valor sean mayor que v, si es cierto entones se retornara
el valor de autollamarse y pasarse el valor de v, y el valor de child de n en i+1. Después con un if evalúa que el
valor de key de n en la posición de i sea v si e cierto entonces retornara true, pero si no es cierto entonces se
valuara que el valor de key en i sea menor a v si es cierto entonces se llama a find y se le envían los valores n y el
valor d child de n en i+1,pero si no es cierto entonces se llama al método fin al cual se le pasa como parámetro v,
y chil de n en la posicion de i
Ejercicio 6.- Creación de un árbol B

Agrega al menú de usuario, una opción para que el usuario pueda acceder a las operaciones de un árbol B de la
implementación proporcionada

1) Crear Árbol

2) Agregar un valor

3) Buscar Valor

4) Imprimir árbol

En el menú principal de la clase MenuArbolesBin, si se elige este caso entonces se llama al método menuB, este
método es private static void y no recibe valores, dentro se declara un BTree llamado árbol, un scanner llamado
input, un entero llamado opción y un booleano llamado salir, enseguida se ejecuta un ciclo while mientras el valor
de salir sea false , enseguida se muestra el menú el cual está compuesto por: Crear Árbol. Agregar un valor, Buscar
Valor, Imprimir árbol, se le pide al usuario dar el número de algún caso y dicha decisión se guarda en opción,
enseguida se ejecuta un switch con opción, si se elige el caso 1 correspondiente a crear un BTree se pedir el orden
del BTree y con esta valor se llamara al constructor, si se elige el caso 2 entonces se le pedirá al usuario dar el
dato a agregar y con ese valor se ejecutará el método add de árbol con el valor dado como mensaje, si se elige le
caso 3 entonces se le pedirá al usuario dar el valor a buscar y con este se llamara al método find de árbol, el valor
de retorno de este método (un boolean ) será impreso después de la leyenda “Estaba?”, si se elige el caso 4
entonces se mostrara la leyenda “El árbol es” y se llamara al método mostrar Árbol, finalmente si se elige el caso
5 a salir se le asignara el valor de true.
Ilustración 22 Captura de ejecución del menú de árboles B, donde se observa cómo se agregan algunos valores
Ilustración 23 Captura de ejecución del menú arboles binarios de búsqueda donde se observa cómo se agregan
algunos valores

Ilustración 24 Captura de ejecución de la implementación del menú de arbolesB y sus métodos


Conclusiones.

En esta práctica conocimos las formas de representar un árbol binario, binario de búsqueda y un arbolB, primero
durante las clases teóricas conocimos el funcionamiento y las características de dichos árboles, este conocimiento
fue retroalimentado por el ejercicio en clase para finalmente llegar al laboratorio y pasar de una forma efectiva
estos conceptos a código.

En esta práctica la principal dificultad encontrada fue abstraer los conceptos para poder pasar las instrucciones y
el proceso de cada árbol y recorrido a un lenguaje que pudiera ser ejecutado por una computadora. Se presentaron
dificultados principalmente en los recorridos sin embargo al usar una estructura recursiva facilito el recorrido de
igual forma me pareció muy interesante que para los recorridos solo era necesario cambiar en qué punto se
colocaba el método visitados o en que parte cambia se imprimía, ya que esta fue la principal diferencia entre los
ordenamientos post Orden, in orden y post orden;, otro problema presentado fue al momento de eliminar ya que
las hojas no contenían un valor por el cual ser intercambiado y solo eliminar una referencia y el nodo root no tenía
ni a un padre y un nodo por el cual ser intercambiado, sin embargo a colocar ciertos condicionales y colocara las
instrucciones para eliminar en lugares estratégicos se consiguió eliminar los nodos deseados.

La práctica personalmente no me pareció tan difícil, considero que mi grado de entendimiento sobre estos árboles
es bueno, el tema más complejo fueron los arbolesB ya que cada uno de sus métodos y procesos eran muy largos,
contenían muchas instrucciones y una gran cantidad de combinación de estructuras condicionales e iterativas, sin
embargo, después de analizarlo no resulta particularmente difícil.

En esta práctica además logramos ampliar nuestro conocimiento sobre diversos temas de los cuales
el principal fue Java ya que se requiere de distintos elementos de lenguaje, además de explorar que
elementos era conveniente usar y cuáles no.

Por todo lo anterior podemos decir que los objetivos fueron cumplidos.

También podría gustarte