Está en la página 1de 20

Universidad Nacional de San Cristóbal de Huamanga IS241-Estructura de datos

Semana 9
PRIMERA UNIDAD 3

Competencias

 Estructurar datos en orden jerárquico.


 Conocer la terminología básica relativa a árboles.
 Distinguir los diferentes tipos de árboles binarios.
 Recorrer un árbol binario de tres formas diferentes.
 Reconocer la naturaleza recursiva de las operaciones con árboles.
 Representar un árbol binario con una estructura enlazada.
 Evaluar una expresión algebraica utilizando un árbol binario.
 Construir un árbol binario ordenado (de búsqueda).
Contenido
Árboles generales y terminología. Árboles binarios.. Estructura de un árbol binario.. Árbol de
expresión. Recorrido de un árbol. Árbol binario de búsqueda. Operaciones en árboles binarios de
búsqueda Implementación
.

Listas enlazadas
Mapa Conceptual
Lineales

Operaciones

Pilas

ESTRUCTURAS DINAMICAS
LINE
Colas

Arboles

No lineales

Grafos

1
Universidad Nacional de San Cristóbal de Huamanga IS241-Estructura de datos

VISTA OPERACIONAL DE LA ESTRUCTURA ÁRBOL

INTRODUCCION

El árbol es una estructura de datos dinámica no lineales y muy importante en la programación.


Los árboles se manipulan para organizar fórmulas algebraicas, para crear objetos en orden de tal
forma que las búsquedas sean muy eficientes y en aplicaciones diversas tales como inteligencia
artificial o algoritmos de cifrado. Casi todos los sistemas operativos almacenan sus archivos en
árboles o estructuras similares a árboles. Además de las aplicaciones citadas, los árboles se
utilizan en diseño de compiladores, procesado de texto y algoritmos de búsqueda.
En este tema se estudiara a esta estructura en sus tres perspectivas, nivel lógico, nivel de
implementación y aplicación.

1. ÁRBOLES GENERALES y TERMINOLOGÍA

1.1 Definiciones

 Un árbol consta de un conjunto finito de elementos, llamados nodos y de un conjunto


finito de líneas dirigidas, llamadas ramas, que conectan los nodos.

 Un árbol es un conjunto de uno o más nodos tales que:

2
Universidad Nacional de San Cristóbal de Huamanga IS241-Estructura de datos

Hay un nodo diseñado especialmente llamado raíz.


Los nodos restantes se dividen en n ≥ 0 conjuntos disjuntos, T1 ...Tn, tal que cada uno
de estos conjuntos es un árbol. A T1 ...Tn se les denomina subárboles del raíz.

 Estructura no lineal jerárquica en la que cada elemento tiene un único antecesor y


puede tener varios sucesores. En donde existe un único camino entre el primer nodo
de la estructura y cualquier otro nodo.

Vista de un árbol

1.2 Definición recursiva

El concepto de subárbol conduce a una definición recursiva de un árbol. Un árbol es un


conjunto de nodos que:
1. Es vacío.
2. O tiene un nodo determinado, llamado raíz, del que jerárquicamente descienden cero o
más subárboles, que son también árboles.

3
Universidad Nacional de San Cristóbal de Huamanga IS241-Estructura de datos

1.3 Terminología

a. El primer nodo de un árbol, normalmente dibujado en la posición superior, se denomina


raíz del árbol.
b. Las flechas que conectan un nodo con otro se llaman arcos o ramas.
c. Los nodos terminales, esto es, nodos de los cuales no se deduce ningún nodo, se
denominan hojas.
d. Los nodos que no son hojas se denominan nodos internos.
e. En un árbol donde una rama que va de un nodo n1 a un nodo n2, se dice que n1 es el
padre de n2 y que n2 es un hijo de n1.
f. n1 se llama ascendiente de n2, si n1 es el padre de n2 o si n1 es el padre de un
ascendiente de n2.
g. n2 se llama descendiente de n1, si n1 es un ascendiente de n2
h. Un camino de n1 a n2 es una secuencia de arcos contiguos que van de n1 a n2
i. La longitud de un camino es el número de arcos que contiene o, de forma equivalente,
el número de nodos del camino menos uno.
j. El nivel de un nodo es la longitud del camino que lo conecta al nodo raíz.
k. La profundidad o altura de un árbol es la longitud del camino más largo que conecta la
raíz a una hoja.
l. Un subárbol de un árbol es un subconjunto de nodos del árbol, conectados por ramas
del propio árbol, esto es, a su vez un árbol.
Sea S un subárbol de un árbol A: si para cada nodo n de SA, SA contiene también
todos los descendientes de n en A, SA se llama un subárbol completo de A.
m. Un árbol está equilibrado cuando, dado un número máximo k de hijos de cada nodo y
La altura del árbol h, cada nodo de nivel k < h-1 tiene exactamente k hijos.
El árbol está equilibrado perfectamente, si cada nodo de nivel l<h tiene exactamente k
hijos.

4
Universidad Nacional de San Cristóbal de Huamanga IS241-Estructura de datos

B C D

E F G H

I J K

profundidad(A)=0
profundidad(H)=2
altura=3
camino(A,K)={A,B,F,K}
camino(C,K)={}

2. ÁRBOLES BINARIOS
Es un árbol que solo puede tener dos como máximo de hijos, es decir dos subárboles. Se
conoce al nodo izquierdo como hijo izquierdo y al nodo derecho como hijo derecho.

5
Universidad Nacional de San Cristóbal de Huamanga IS241-Estructura de datos

3. ESTRUCTURA DE UN ÁRBOL BINARIO

Un árbol binario es una estructura recursiva, que se divide en tres subconjuntos distintos:
Conjunto del nodo raíz {R}
Conjunto del subárbol izquierdo de R {I1,I2,……In}
Conjunto del subárbol derecho de R{D1,D2,D3,….Dn}

I1 D1

D2
I2
I3

3.1 TAD DE UN ARBOL BINARIO

Creación de un árbol crearArbol (nombreArbol)


Comprobación del estado arbolVacio(nombreArbol)  Booleano
Inserción de nodos insertar(padre, valorInfo, posicion)
insertar(padre, valorInfo)
Borrado de nodos borrar(nombreArbol, valorInfo)
Búsqueda de un nodo buscar(nombreArbol, dato) 
informacion

6
Universidad Nacional de San Cristóbal de Huamanga IS241-Estructura de datos

buscar(nombreArbol,
información)referenciaNodo

Recorrido del árbol recorrer(nombreArbol,tipoRecorrido)


Acceso a los nodos info(referenciaNodo)  Informacion
primerHijo(referenciaNodo)  enlace
hijos(referenciaNodo)  {enlace}
eshoja(referenciaNodo)  Booleano

Modificación de los nodos asignarInfo(referenciaNodo,


valorInformacion)
añadirHijo(referenciaNodo, valorInfo)
quitarHijo(referenciaNodo, valorInfo)

3.2 ESTRUCTUTURA DE UN ALBOL BINARIO CON NODOS

4. ÁRBOL DE EXPRESIÓN
Una muestra muy importante de los árboles binarios son los árboles de
expresiones. Una expresión es una secuencia de componentes de léxicos
(token). Un Token puede ser un operando o bien un operador.

a * (b + c) + d
d
*

*
a

Expresión infija de un árbol de


b c expresiones

7
Universidad Nacional de San Cristóbal de Huamanga IS241-Estructura de datos

* -

x a b
-

y z

Árbol de expresión ( x * (y - z) ) + (a - b)

Dibujar la representación en árbol binario de cada una de las siguientes


expresiones
a) Y * X / (A + B) *C
b) X * Y / A + B * C

Los árboles de expresiones se utilizan en las computadoras para evaluar


expresiones usadas en programas. El algoritmo más sencillo para construir un
árbol de expresión es aquel que lee una expresión completa que contiene
paréntesis. Una expresión con paréntesis es aquella en que :
1) La prioridad se determina sólo por paréntesis.
2) La expresión completa se sitúa entre paréntesis.
A fin de ver la prioridad en las expresiones, considere la expresión
a * c + e / g – (b + d)
Los operadores con prioridad más alta son * y /, es decir:
(a * c) + (e / g) – ( b + d)
Los operadores que siguen en orden de prioridad son + y -, que se evalúan de
izquierda a derecha. Por consiguiente, se puede escribir: ((a * c) + (e / g)) – ( b +
d)
Por último, la expresión completa entre paréntesis será:

8
Universidad Nacional de San Cristóbal de Huamanga IS241-Estructura de datos

(((a * c) + (e / g)) – ( b + d))

Algoritmo para la construcción de un árbol de expresión puede expresarse en los


siguientes pasos:
1) La primera vez que se encuentre un paréntesis a izquierda crear un nodo
que será el nodo raíz. Se llama a éste nodo actual y se sitúa en una pila.
2) Cada vez que se encuentre un nuevo paréntesis a izquierda, crear un
nuevo nodo. Si el nodo actual no tiene un hijo izquierdo, hacer el nuevo
nodo el hijo izquierdo; en caso contrario, hacerlo el hijo derecho. Hacer el
nuevo nodo actual y ponerlo en la pila
3) Cuando se encuentre un operando, crear un nuevo nodo y asignar el
operando a su campo de datos. Si el nodo actual no tiene un hijo izquierdo,
hacer el nuevo nodo el hijo izquierdo; en caso contrario, hacerlo el hijo
derecho.
4) Cuando se encuentre un operador, sacar el nodo cabeza de la pila y situar
el operador en el campo dato del nodo.
5) Ignorar el paréntesis derecho y los blancos.

* /

a b c d

a) ((a * b) + (c / d))

+ d

+ c

a b

b) (((a + b) + c)+ d)

9
Universidad Nacional de San Cristóbal de Huamanga IS241-Estructura de datos

+ *

- + + *

a x y b c d

c) (((-a) + (x + y)) / (( + b) * ( c * d)))

5. RECORRIDO DE UN ÁRBOL.
Para visualizar o consultar los datos almacenados en un árbol se necesita
recorrer el árbol o visitar los nodos del mismo. Al contrario que las listas
enlazadas, los árboles binarios no tienen realmente un primer valor, un
segundo valor, un tercer valor, etc. Se puede afirmar que el nodo raíz viene
el primero, pero ¿Quién viene a continuación? Existen diferentes métodos
de recorrido de árbol ya que la mayoría de las aplicaciones con árboles son
bastante sensibles al orden en el que se visitan los nodos, de forma que
será preciso elegir cuidadosamente el tipo de recorrido.

El Recorrido de un árbol binario, requiere que cada nodo del árbol sea
procesado (visitado) una vez, y sólo una, en una secuencia predeterminada.
Existen dos enfoques generales para la secuencia de recorrido, profundidad
y anchura.

En el Recorrido de Profundidad, el proceso exige un camino desde la


raíz a través de un hijo, al descendiente más lejano del primer hijo, antes
de proseguir a un segundo hijo. En otras palabras, en el recorrido en
profundidad, todos los descendientes de un hijo se procesas antes del
siguiente hijo.

En el Recorrido en Anchura, el proceso se realiza horizontalmente desde


la raíz a todos sus hijos; a continuación a los hijos de sus hijos y así
sucesivamente hasta que todos los nodos han sido procesados. En el

10
Universidad Nacional de San Cristóbal de Huamanga IS241-Estructura de datos

recorrido en anchura, cada nivel se procesa totalmente antes de que


comience el siguiente nivel.
Recorrido de un árbol supone visitar cada nodo sólo una vez.

Recorrido Preorden
El recorrido preorden (RID) conlleva los siguientes pasos, en los que el
nodo raíz va antes que los subárboles.
1) Visitar el Nodo Raíz ( R )
2) Recorrer el subárbol izquierdo ( I ) en Preorden.
3) Recorrer el subárbol derecho ( D) en Preorden.

1
B C

2 5
D E F G

3 4 6 7

Recorrido preorden A,B,D,E,C,F,G

Recorrido en Orden
El recorrido en Orden, procesa primero el subárbol izquierdo, después la raíz y
a continuación, el subárbol derecho. El significado de in es que la raíz se
procesa entre los subárboles.
Si el árbol no está vacío, el método implica los siguientes pasos:
1) Recorrer el subárbol izquierdo ( I ) en Orden.
2) Visitar el Nodo Raíz ( R )
3) Recorrer el subárbol derecho ( D) en Orden.
A

4
B C

2 6
D E F G

1 3 5 7
Recorrido en Orden D,B,E,A,F,C,G

11
Universidad Nacional de San Cristóbal de Huamanga IS241-Estructura de datos

Recorrido Post Orden


El recorrido en Postorden procesa el nodo raíz después de que los subárboles
izquierdo y derecho se hayan procesado. Comienza situándose en la hoja más
a la izquierda y se procesa. A continuación, se procesa su subárbol derecho.
Por último, se procesa el nodo raíz. Las etapas del algoritmo, si el árbol no
está vacío, son:
1) Recorrer el subárbol izquierdo ( I ) en PostOrden.
2) Recorrer el subárbol derecho ( D) en PostOrden.
3) Visitar el Nodo Raíz ( R )

7
B C

3 6
D E F G

1 2 4 5

Recorrido en PostOrden D,E,B,F,G,C,A

Deducir el orden de los elementos en cada uno de los tres recorridos


fundamentales de los árboles binarios siguientes:

* /

a b c a

a)

12
Universidad Nacional de San Cristóbal de Huamanga IS241-Estructura de datos

+ d

+ c

a b

b)

+ *

- + + *

a x y b c d

c)

6. ÁRBOL BINARIO DE BÚSQUEDA (ABB)

Se trata de árboles de orden 2 en los que se cumple que para cada nodo, el valor de la
clave de la raíz del subárbol izquierdo es menor que el valor de la clave del nodo y que el
valor de la clave raíz del subárbol derecho es mayor que el valor de la clave del nodo.

13
Universidad Nacional de San Cristóbal de Huamanga IS241-Estructura de datos

6.1 OPERACIONES EN ÁRBOLES BINARIOS DE BÚSQUEDA.

El repertorio de operaciones que se pueden realizar sobre un ABB es parecido al que


realizábamos sobre otras estructuras de datos, más alguna otra propia de árboles:

 Buscar un elemento.

 Insertar un elemento.

 Borrar un elemento.

 Movimientos a través del árbol:

o Izquierda.

o Derecha.

o Raiz.

 Información:

o Comprobar si un árbol está vacío.

o Calcular el número de nodos.

o Comprobar si el nodo es hoja.

o Calcular la altura de un nodo.

o Calcular la altura de un árbol.

Buscar un elemento

14
Universidad Nacional de San Cristóbal de Huamanga IS241-Estructura de datos

Partiendo siempre del nodo raíz, el nodo 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.
 Si el valor del nodo raíz es menor que el elemento que buscamos,
continuaremos la búsqueda en el árbol derecho.
El valor de retorno de una función de búsqueda en un ABB puede ser un puntero
al nodo encontrado, o NULL, si no se ha encontrado.

Insertar un elemento

Para insertar un elemento nos basamos en el algoritmo de búsqueda. Si el elemento


está en el árbol no lo insertaremos. Si no lo está, lo insertaremos 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.

o 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.

o 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 nodo no es NULL, el elemento está en el árbol, por lo tanto salimos.

15
Universidad Nacional de San Cristóbal de Huamanga IS241-Estructura de datos

 Si 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 sigue siendo ABB.

Borrar el 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:

1. Se trata de un nodo hoja: en ese caso lo borraremos directamente.

2. Se trata de un nodo rama: en ese caso no podemos eliminarlo, puesto que


perderíamos todos los elementos del árbol de 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 e intercambiamos sus valores. A
continuación eliminamos el nodo hoja.

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

 Si el árbol está vacío: el elemento no está en el árbol, por lo tanto salimos sin
eliminar ningún elemento.

 (1) Si el valor del nodo raíz es igual que el del elemento que buscamos,
estamos ante uno de los siguientes casos:

o El nodo raíz es un nodo hoja:

 Si 'Padre' es NULL, el nodo raíz es el único del árbol,


por lo tanto el puntero al árbol debe ser NULL.

 Si raíz es la rama derecha de 'Padre', hacemos que


esa rama apunte a NULL.

16
Universidad Nacional de San Cristóbal de Huamanga IS241-Estructura de datos

 Si raíz es la rama izquierda de 'Padre', hacemos que


esa rama apunte a NULL.

 Eliminamos el nodo, y salimos.

o El nodo no es un nodo hoja:

 Buscamos el 'nodo' más a la izquierda del árbol


derecho de raíz o el más a la derecha del árbol
izquierdo. Hay que tener en cuenta que puede que
sólo exista uno de esos árboles. Al mismo tiempo,
actualizamos 'Padre' para que apunte al padre de
'nodo'.

 Intercambiamos los elementos de los nodos raíz y


'nodo'.

 Borramos el nodo 'nodo'. Esto significa volver a (1),


ya que puede suceder que 'nodo' no sea un nodo
hoja. (Ver ejemplo 3)

 Si el valor del nodo raíz es mayor que el elemento que buscamos,


continuaremos la búsqueda en el árbol izquierdo.

 Si el valor del nodo raíz es menor que el elemento que buscamos,


continuaremos la búsqueda en el árbol derecho.

Ejemplo 1 para Borrar una hoja

En el árbol de ejemplo, borrar el nodo 3.

1. Localizamos el nodo a borrar, al tiempo que mantenemos un puntero a


'Padre'.

2. Hacemos que el puntero de 'Padre' que apuntaba a 'nodo', ahora apunte a


NULL.

3. Borramos el 'nodo'.

17
Universidad Nacional de San Cristóbal de Huamanga IS241-Estructura de datos

Elemplo 2 Borrar un nodo rama con el intercambio de un nodo hija

En el árbol de ejemplo, borrar el nodo 4.

1. Localizamos el nodo a borrar ('raíz').

2. Buscamos el nodo más a la derecha del árbol izquierdo de 'raíz', en este caso
el 3, al tiempo que mantenemos un puntero a 'Padre' a 'nodo'.

3. Intercambiamos los elementos 3 y 4.

4. Hacemos que el puntero de 'Padre' que apuntaba a 'nodo', ahora apunte a


NULL.

5. Borramos el 'nodo'.

Ejemplo 3 borrar un nodo rama con intercambio de nodo rama

18
Universidad Nacional de San Cristóbal de Huamanga IS241-Estructura de datos

En éste borraremos el elemento 6

1. Localizamos el nodo a borrar ('raíz').

2. Buscamos el nodo más a la izquierda del árbol derecho de 'raíz', en este caso
el 12, ya que el árbol derecho no tiene nodos a su izquierda, si optamos por la
rama izquierda, estaremos en un caso análogo. Al mismo tiempo que
mantenemos un puntero a 'Padre' a 'nodo'.

3. Intercambiamos los elementos 6 y 12.

4. Ahora tenemos que repetir el bucle para el nodo 6 de nuevo, ya que no


podemos eliminarlo.

5. Localizamos de nuevo el nodo a borrar ('raíz').

6. Buscamos el nodo más a la izquierda del árbol derecho de 'raíz', en este caso
el 16, al mismo tiempo que mantenemos un puntero a 'Padre' a 'nodo'.

7. Intercambiamos los elementos 6 y 16.

8. Hacemos que el puntero de 'Padre' que apuntaba a 'nodo', ahora apunte a


NULL.

19
Universidad Nacional de San Cristóbal de Huamanga IS241-Estructura de datos

9. Borramos el 'nodo'.

20

También podría gustarte