Está en la página 1de 17

NOMBRE: HUGO ALBERTO ORTIZ ANAYA

DOCENTE: SERGIO ELIAS CASTA„ON NAVARRO


GRUPO: G-303
TEMA: EXPERIENCIA DE APRENDIZAJE. ALGORITMOS DE
BÚSQUEDA Y ANÁLISIS DE ALGORITMOS
MATERIA: ESTRUCTURAS DE DATOS
Indicaciones:

1. Lee detenidamente el contenido de la unidad.

2. Implementa una clase o función árbol de búsqueda binaria árbol


Búsqueda para almacenar la información de los usuarios utilizado el
lenguaje de programación y software de tu preferencia (si tienes dudas,
consulta la información con tu docente).

La clase o función debe contener los siguientes métodos u operaciones:


insertar Usuario, recibe un objeto Usuario y lo añade a la estructura de
datos. Tiene que estar ordenado alfabético por el nombre de usuario. Si
ya hay un usuario con el mismo nombre, el método solo muestra un
mensaje de error “El usuario ya existe”.
borrar Usuario, recibe una cadena (String) como parámetro y elimina del
árbol al usuario cuyo nombre de usuario es igual al parámetro.
encontrar Usuario, recibe una cadena (String) y devuelve el usuario cuyo
nombre completo es igual al parámetro. El método tiene que imprimir
toda la información del usuario. muestra (): muestra todos los usuarios
en orden alfabético (ascendente) por nombre de usuario.
muestra Nivel (): muestra todos los usuarios del árbol binario de
búsqueda por orden de nivel.
Contagio (): recibe una cadena (String) como parámetro y aumenta el
número de contagio d recibidos por un usuario cuyo nombre es igual al
parámetro de entrada. Si el número de contagios es igual a 5, el usuario
debe ser notificado.
Dado que en ocasiones es necesario realizar una búsqueda de
elementos se han creado
métodos y algoritmos que permiten realizar búsquedas eficientes:
Dentro de los métodos encontramos:
Búsqueda secuencial o lineal.
Búsqueda binaria
Búsqueda por transformación de claves (HASHING).
Insertar usuario recibe un objeto usuario y lo añade a la estructura de
datos tiene que estar
ordenado alfabético por el nombre de usuario si ya hay un usuario con
el mismo nombre, el método solo muestra un mensaje de error "el
usuario ya existe"
Es conveniente hacer notar la diferencia entre este procedimiento y el
de búsqueda binaria. En éste podría pensarse en que se usa un árbol
binario para describir la secuencia de comparaciones hecha por una
función de búsqueda sobre el vector. En cambio en los ABB se
construye una estructura de datos con registros conectados por
punteros y se usa esta estructura para la búsqueda. El procedimiento de
construcción de un ABB puede basarse en un procedimiento de
inserción que vaya añadiendo elementos al árbol. Tal procedimiento
comenzaría mirando si el árbol es vacío y de ser así se crearía un nuevo
nodo para el
elemento insertado devolviendo como árbol resultado un puntero a ese
nodo. Si el árbol no está vacio se busca el elemento a insertar como lo
hace el procedimiento pertenece sólo que al encontrar un puntero NULL
durante la búsqueda, se reemplaza por un puntero a un nodo nuevo que
contenga el elemento a insertar. El código podría ser el siguiente: void
Insertar (t Elemento x, ABB
{

if(!(*t))

*t=(nodo AABB)malloc(sizeof(struct tipoceldaABB)); if(!(*t))

error("Memoria Insuficiente.");

(*t)->etiqueta=x;

(*t)->hizq da=NULL; (*t)->h d rch a=NULL;

else if(x<(*t)->etiqueta) inserta(x,&((*izqda)); else

inserta(x,&((*t)->hdr cha));

Por ejemplo, supongamos que queremos construir un ABB a partir del conjunto de enteros

{10, 5, 14, 7, 12} aplicando reiteradamente el proceso de inserción. El resultado es el que muestra la
siguiente figura:
análisis de la eficiencia de las operaciones Esquema de un ABB
es necesario pues determinar si el ABB promedio con n nodos se acerca
en estructura al árbol completo o a la cadena, es decir, si el tiempo
medio por operación es O(log2n), O (n una cantidad intermedia. cómo
es difícil saber la verdadera frecuencia de inserciones sólo se puede
analizar la longitud del camino promedio de árboles "aleatorios"
adoptando algunas suposiciones como que los árboles se forman sólo a
partir de inserciones y que todas las magnitudes de los n elementos
insertados tienen igual probabilidad. con esas suposiciones se puede
calcular P(n), el número promedio de nodos del camino que va de la raíz
hacia algún nodo (no necesariamente una hoja). Se supone que el árbol
se formó con la inserción aleatoria de n nodos en un árbol que se
encontraba inicialmente vacío, es evidente que P(0)=0 y P(1)=1.
Supongamos que tenemos una lista de n>=2 elementos para insertar en
un árbol vacío, el primer elemento de la lista, x, es igual de probable que
sea el primero, el segundo o el n-ésimo en la lista ordenada.
Consideremos que i elementos de la lista son menores que x de modo
que n-i-1 son mayores. Al construir el árbol, x aparecerá en la raíz, los i
elementos más pequeños serán descendientes izquierdos de la raíz y los
restantes n-i-1 serán descendientes derechos como se muestra en la
figura.
Borrar usuario: recibe una cadena(string)como parámetro y elimina del
árbol al usuario cuyo nombre de usuario es igual al parámetro
Para borrar un usuario también nos basamos en el algoritmo de
búsqueda Si el elemento no está en el árbol no lo podremos borrar Si
está, hay dos casos

• operaciones en ABB
El árbol de operaciones que se pueden realizar sobre un ABB es
parecido al que realizamos sobre otras estructuras de datos, más alguna
otra propia de árboles:
Buscar un elemento. Insertar un elemento. Borrar un elemento.

Partiendo siempre del nodo raíz, el modo de buscar un elemento se define de forma recursiva. Si el árbol
está vacío, terminamos la búsqueda: el elemento no está en el árbol.

Si el valor del nodo raíz es igual que el del elemento que buscamos, terminamos la búsqueda con éxito.

Si el valor del nodo raíz es mayor que el elemento que buscamos, continuaremos la búsqueda en el árbol
izquierdo.

Insertar un elemento
Para insertar un elemento nos basamos en el algoritmo de búsqueda. Si
el elemento está en el árbol no lo insertamos. Si no lo está, lo
insertamos a continuación del último nodo visitado. Necesitamos un
puntero auxiliar para conservar una referencia al padre del nodo raíz
actual. El valor inicial para ese puntero es NULL.
Padre = NULL nodo = Raiz
Bucle: mientras actual no sea un árbol vacío o hasta que se encuentre el
elemento.
Si el valor del nodo raíz es mayor que el elemento que buscamos,
continuaremos la búsqueda en el árbol izquierdo: Padre=nodo,
nodo=nodo->izquierdo.
Si el valor del nodo raíz es menor que el elemento que buscamos,
continuaremos la búsqueda en el árbol derecho: Padre=nodo,
nodo=nodo->derecho.
si el nodo no es NULL, el elemento está en el árbol, por lo tanto salimos.
Si el padre es NULL, el árbol estaba vacío, por lo tanto, el nuevo árbol
sólo contendrá el nuevo elemento, que será la raíz del árbol.
Si el elemento es menor que el Padre, entonces insertamos el nuevo
elemento como un nuevo árbol izquierdo de Padre.
Si el elemento es mayor que el Padre, entonces insertamos el nuevo
elemento como un nuevo árbol derecho de Padre.
Este modo de actuar asegura que el árbol siga siendo ABB. borrar un
elemento
Para borrar un elemento también nos basamos en el algoritmo de
búsqueda. Si el elemento no está en el árbol no lo podremos borrar. Si
está, hay dos casos posibles:
Se trata de un nodo de árbol de búsqueda binaria en ese caso lo
borraremos directamente. Se trata de un nodo rama: en ese caso no
podemos eliminarlo, puesto que perderíamos todos los elementos del
árbol del que el nodo actual es padre. En su lugar buscamos el nodo más
a la izquierda del subárbol derecho, o el más a la derecha del subárbol
izquierdo

intercambiamos sus valores. A continuación, eliminamos el nodo de la


hoja. Ejemplo: Borrar un nodo hoja
En el árbol de ejemplo, borrar el nodo 3.
Localizamos el nodo a borrar, al tiempo que mantenemos un puntero a
'Padre'. Hacemos que el puntero de 'Padre' que apuntaba a 'nodo',
ahora apunte a NULL. Borramos el 'nodo'.

Encontrar usuario recibe una cadena(string)y devuelve el usuario cuyo nombre completo es
igual al parámetro el método tiene que imprimir toda la información del usuario Un árbol
binario de búsqueda (abb) se basa en la propiedad de que las claves que son menores que el
padre se encuentran en el subárbol izquierdo, y las claves que son mayores que el padre se
encuentran en el subárbol derecho. llamaremos esto la propiedad abb. a medida que
implementemos la interfaz de vector asociativo como se describió anteriormente, la
propiedad abb guiará nuestra implementación. La Figura 1 ilustra esta propiedad de un
árbol binario de búsqueda, mostrando las claves sin ningún valor asociado. Observe que la
propiedad es válida para cada padre e hijo. Todas las claves del subárbol izquierdo son
menores que la clave de la raíz. Todas las claves en el subárbol derecho son mayores que la
raíz.

El árbol de búsqueda de la figura 1 representa los nodos que existen después de haber
insertado las siguientes claves en el orden mostrado:
70,31,93,94,14,23,7370,31,93,94,14,23,7dado que 70 fue la primera clave insertada en el
árbol, es la raíz. A continuación, 31 es menor que 70, por lo que se convierte en el hijo
izquierdo de 70. Luego, 93 es mayor que 70, por lo que se convierte en el hijo derecho de 70.
Ahora tenemos dos niveles del árbol llenos, así que la siguiente clave va a ser el hijo
izquierdo o derecho de 31 o 93. Dado que 94 es mayor que 70 y 93, se convierte en el hijo
derecho de 93. Similarmente 14 es menor que 70 y 31, por lo que se convierte en el hijo
izquierdo de 31. 23 es también menor que 31, por lo que debe estar en el subárbol izquierdo
de 31. Sin embargo, es mayor que 14, por lo que se convierte en el hijo derecho de 14.
Para implementar el árbol binario de búsqueda, utilizaremos un enfoque de nodos y
referencias similar al que utilizamos para implementar la lista enlazada y el árbol de
expresiones. Sin embargo, puesto que debemos ser capaces de crear y trabajar con un árbol
binario de búsqueda que esté vacío, nuestra implementación utilizará dos clases. A la
primera clase la llamaremos Árbol Binario Búsqueda y a la segunda clase la llamaremos
Nodo Árbol. La clase Árbol binario Búsqueda tiene una referencia a Nodo Árbol que es la
raíz del árbol binario de búsqueda. En la mayoría de los casos, los métodos externos
definidos en la clase externa simplemente comprueban si el árbol está vacío. Si hay nodos en
el árbol, la petición simplemente se pasa a un método privado definido en la clase Árbol
Binario Búsqueda que recibe la raíz como parámetro. En caso que el árbol esté vacío o
queramos borrar la clave en la raíz del árbol, debemos tomar medidas especiales. El código
para el constructor de la clase Árbol binario de búsqueda junto con algunas otras funciones
misceláneas se muestra en el Programa.
Programa 1
class Árbol binario búsqueda:

def init (self):


self.raiz = None
self.tamano = 0

def longitud(self):
return self.tamano

def len (self):


return self.tamano

def iter (self):


return self.raiz. iter ()
la clase Nodo Árbol proporciona muchas funciones auxiliares que hacen que el trabajo
realizado en los métodos de la clase Árbol Binario Búsqueda sea mucho más fácil. El
constructor de un Nodo Árbol, junto con estas funciones auxiliares, se muestra en el
Programa 2. Como se puede ver en el programa, muchas de estas funciones auxiliares
ayudan a clasificar un nodo según su propia posición como hijo, (izquierdo o derecho) y
el tipo de hijos que tiene el nodo. la clase Nodo Árbol también mantendrá
explícitamente un seguimiento del padre como un atributo de cada nodo. usted verá por
qué esto es importante cuando discutamos la implementación del operador. muestra ()
muestra todos los usuarios en orden alfabético(ascendente)por nombre de usuario
Arboles de búsqueda binaria la búsqueda en árboles binarios es un método de búsqueda
simple, dinámico y eficiente considerado como uno de los fundamentales en Ciencia de
la Computación. De toda la terminología sobre árboles, tan sólo recordar que la
propiedad que define un árbol binario es que cada nodo tiene a lo más un hijo a la
izquierda y uno a la derecha. Para construir los algoritmos consideraremos que cada
nodo contiene un registro con un valor clave a través del cual efectuaremos las
búsquedas.

cual efectuaremos las búsquedas. Es conveniente hacer notar la


diferencia entre este procedimiento y el de búsqueda binaria. En éste
podría pensarse en que se usa un árbol binario para describir la
secuencia de comparaciones hecha por una función de búsqueda sobre el
vector. En cambio, en los ABB se construye una estructura de datos con
registros conectados por punteros y se usa esta estructura para la
búsqueda. El procedimiento de construcción de un ABB puede basarse
en un procedimiento de inserción que vaya añadiendo elementos al árbol. Tal
procedimiento comenzaría mirando si el árbol es vacío de ser así se crearía un
nuevo nodo para el elemento insertado devolviendo como árbol resultado un
puntero a ese nodo. Si el árbol no está vacío se busca el elemento a insertar como
lo hace el procedimiento pertenece sólo que al encontrar un puntero NULL
durante la búsqueda, se reemplaza por un puntero a un nodo nuevo que contenga el
elemento a insertar. El código podría ser el siguiente: void Inserta (t Elemento x,
ABB
if(! (*t)){
*t=(nodoABB)malloc(sizeof(struct tipoceldaABB));
if(!(*t)){
error("Memoria Insuficiente.");
}
(*t)->etiqueta=x;
(*t)->hizqda=NULL;
(*t)->hdrcha=NULL;
} else if(xetiqueta)
inserta(x,&((*t)->hizqda));
else
inserta(x,&((*t)->hdrcha));
}
En las implementaciones que presentaremos sólo se considerará en cada nodo del árbol un
valor del tipo t Elemento, aunque en un caso general ese tipo estará compuesto por dos: una
clave indicando el campo por el cual se realiza la ordenación y una información asociada a
dicha clave ovisto de otra forma, una información que puede ser compuesta en la cual existe
definido un orden. Un árbol binario de búsqueda (ABB) es un árbol binario con la
propiedad de que todos los elementos almacenados en el subárbol izquierdo de cualquier
nodo x son menores que el elemento almacenado en x, y todos los elementos almacenados
en el subárbol derecho de x son mayores que el elemento almacenado en x. Por ejemplo,
supongamos que queremos construir un ABB a partir del conjunto de enteros
Los árboles genealógicos y los organigramas son ejemplos comunes. entre otras aplicaciones,
los árboles se emplean para analizar circuitos eléctricos y para representar la estructura de
fórmulas matemáticas, así como para organizar la información de bases de datos, para
representar la estructura sintáctica de un programa fuente en compiladores y para la toma de
decisiones.
concepto de función de árboles de búsqueda binaria
los árboles binarios son estructuras de datos muy similares a las listas doblemente enlazadas,
en el sentido que tienen dos punteros que apuntan a otros elementos, pero no tienen una
estructura lógica de tipo lineal o secuencial como aquellas, sino ramificada. Tienen aspecto
de árbol, de ahí su nombre.
Un árbol binario es una estructura de datos no lineal en la que cada nodo puede apuntar a uno
o máximo a dos nodos. También se suele dar una definición recursiva que indica que es una
estructura compuesta por un dato y dos árboles. Esto son definiciones simples. Este tipo de
árbol se caracteriza porque tienen un vértice principal y de él se desprende dos ramas. La
rama izquierda y la rama derecha a las que también se les conoce como subárboles.
Una representación gráfica de la estructura general de un árbol binario se puede visualizar en
la imagen1 que presente a continuación.
Imagen 1 estructura general de un árbol binario

la rama izquierda y la derecha, también son dos árboles binarios. El vértice principal se
denomina raíz y cada una de las ramas se puede denominar como subárbol izquierdo y
subárbol derecho.

Nodo: Un árbol binario es un conjunto de elementos cada uno de los cuales se denomina
nodo. Un árbol Binario puede tener cero nodos y este caso se dice que está vacío. Puede tener
un sólo nodo, y en este caso solamente existe la raíz del árbol o puede tener un número finito
de nodos. Cada nodo puede estar ramificado por la izquierda o por la derecha o puede no
tener ninguna ramificación.
Con relación al tipo de nodos que hacen parte de los árboles, se identifican algunos nodos:
Nodo hijo: cualquiera de los nodos apuntados por uno de los nodos del árbol. En la gráfica
de la imagen 2, se tiene, ‘D’ y ‘M’ son hijos de ‘A’.
Nodo padre: nodo que contiene un puntero al nodo actual. En el ejemplo, el nodo ‘A’ es padre
de ‘D’ y ‘D’. Los árboles con los que trabajará tienen otra característica importante: cada nodo
sólo puede ser apuntado por otro nodo, es decir, cada nodo sólo tendrá un padre. Esto hace que
estos árboles estén fuertemente jerarquizados, y es lo que en realidad les da la apariencia de
árboles. En cuanto a la posición dentro del árbol se tiene: Nodo raíz: nodo que no tiene padre.
Este es el nodo que usaremos para referirnos al árbol. En el ejemplo anterior, es el nodo ‘A’.
Nodo hoja: nodo que no tiene hijos. En el ejemplo hay varios: ‘L’, ‘K’, ‘I’, ‘E’.
Existen otros conceptos que definen las características del árbol, en relación a su tamaño:
Orden: es el número potencial de hijos que puede tener cada elemento de árbol. De este
modo, se dice que un árbol en el que cada nodo puede apuntar a otros dos es de orden dos, si
puede apuntar a tres será de orden tres y así sucesivamente. Grado: el número de hijos que
tiene el elemento con más hijos dentro del árbol. En el árbol del ejemplo en la imagen 2, el
grado es dos, ya que tanto ‘A’ como ‘D’ y ‘M’ tienen dos hijos, y no existen elementos con
más de dos hijos. Nivel: se define para cada elemento del árbol como la distancia a la raíz,
medida en nodos. El nivel de la raíz siempre será cero y el de sus hijos uno. Así
sucesivamente. En el ejemplo de la imagen 2, el nodo ‘D’ tiene nivel 1, el nodo ‘L’ tiene
nivel 2. Altura: la altura de un árbol se define como el nivel del nodo de mayor nivel. Como
cada nodo de un árbol puede considerarse a su vez como la raíz de un árbol, también se puede
hablar de altura de ramas.
formas de Recorrer un árbol binario
Los árboles binarios, son estructuras de datos no lineales, son considerados como estructuras
jerárquicas y como tal su forma de recorrerlos difiere sustancialmente en comparación con las
listas enlazadas que son estructuras de datos de tipo lineal. En ese orden de ideas, el recorrido
de un árbol binario se lleva a cabo en tres sentidos: Preorden, Inorden y Postorden. A
continuación, se detalla cada caso. Recorrido en Preorden:

Recorrer un árbol en preorden consiste en primer lugar, examinar el dato del nodo raíz,
posteriormente se recorrer el subárbol izquierdo en preorden y finalmente se recorre el
subárbol derecho en preorden. Esto significa que para cada subárbol se debe conservar el
recorrido en preorden, primero la raíz, luego la parte izquierda y posteriormente la parte
derecha.
contagios () recibe una cadena(string)como parametro y aumenta el número de
contagios recibidos por un usuario cuyo nombre es igual al parametro de entrada si el
número de contagios es igual a S, el usuario debe ser notificado. Árbol de búsqueda
binaria un árbol de búsqueda binaria es una estructura de datos basada en nodos donde
cada nodo contiene una llave y dos subárboles, el izquierdo y el derecho. para todos los
nodos, las llaves de los nodos pertenecientes a su subárbol izquierdo deben ser menores
que la llave del nodo, y las llaves de los nodos pertenecientes a su subárbol derecho
deben ser mayores que la llave del nodo. estos subárboles deben calificar también como
árboles de búsqueda binarios.
la complejidad temporal del algoritmo de búsqueda en un árbol de búsqueda binaria es la
altura del propio árbol, la cual es menor que O(log n) para un árbol que contiene n elementos.
a y b pueden ser elegidos usando la fórmula siguiente:
Ahora para resolver este pequeño problema de la función de árbol de búsqueda binaria
contagio hemos planteado una función llamada mostrar mensaje que recibe como parámetro
un string (cadena de caracteres) y lo muestra en pantalla.

Los parámetros van seguidos del nombre de la función encerrados entre paréntesis (y en el
caso de tener más de un parámetro los mismos deben ir separados por coma):
del mostrar mensaje(mensaje):
print("*************************************************")
print(mensaje)
print("*************************************************")
un parámetro podemos imaginarlo como una variable que solo se puede utilizar dentro de la
función.

Ahora cuando llamamos a la función mostrar mensaje desde el bloque principal de nuestro
programa debemos pasar una variable string o un valor de tipo string:

mostrar mensaje ("El programa calcula la suma de dos valores ingresados por teclado.")

el string que le pasamos: "El programa calcula la suma de dos valores ingresados por
teclado." lo recibe el parámetro de la función.

una función con parámetros nos hace más flexible la misma para utilizarla en distintas
circunstancias. En nuestro problema la función mostrar mensaje la utilizamos tanto para la
presentación inicial de nuestro programa como para mostrar el mensaje de despedida. Si no
existieran los parámetros estaríamos obligados a implementar dos funciones como en el caso
siguiente.

usuarios vulnerables () devuelve los nombres de usuarios de los usuarios con


más posibilidades de tener contacto con un posible contagio de COVID 19
los árboles binarios, son estructuras de datos no lineales, son considerados como estructuras
jerárquicas y como tal su forma de recorrerlos difiere sustancialmente en comparación con las
listas enlazadas que son estructuras de datos de tipo lineal. En ese orden de ideas, el recorrido
de un árbol binario se lleva a cabo en tres sentidos: Preorden, Inorden y posto
Fuentes Bibliograficas
www.buenastareas.com.mx

Programacion II-Arboles Binarios-Google Sites.Recuperado de:


https://sites.google.com.mx

Estructura de Datos Recuperado de:


https://www.utm.mx

Arbol Binario En C-Insercion y Recorrido-Parzibytes Blog Recuperado de:https://parzibyte.me>

Arbol Binario Agregar y Eliminar Nodos Phyton-Programador Click Recuperado


de:https://programmerclick.com>article.

Como Generar Arboles Binarios Wikipedia La Enciclopedia Libre Recuperado


de:https://es.m.wikipedia.org>wiki.

Principios de Diseño Aplicados a Arboles Binarios de Busqueda Recuperado de:


https://cimat.repositorioinstitucional.mx

También podría gustarte