Está en la página 1de 6

ARBOLES

Conceptos Generales sobre Arboles

Un árbol impone una estructura jerárquica sobre una colección de objetos, los arboles
genealógicos y los organigramas son ejemplos muy utilizados de arboles.

Un árbol es una colección de elementos llamados nodos, uno de estos nodos es


llamado raíz, junto con una colección de relaciones de paternidad que impone una
estructura jerárquica sobre los nodos.

ARBOL = NODOS + RELACIONES DE PATERNIDAD

Los nodos en un árbol pueden ser nodos padre o nodos hijos, el nodo raíz es el padre
originario de un árbol, los nodos internos de un árbol son todos los nodos padres y los
nodos que no tienen hijos se les conoce con el nombre de hojas del árbol.

Los nodos del árbol pueden contener cualquier tipo de datos que se desee ( un entero,
una lista un string, etc…. ). Formalmente, un árbol se puede definir de manera
recursiva de la siguiente manera:

1. Un solo nodo es, por si mismo, un árbol. Ese nodo es también la raíz de dicho
árbol.
2. Supongamos que n es un nodo y que A1, A2, …….,Ak son arboles con raíces n1,
n2, …..,nk respectivamente. Se puede construir un nuevo árbol haciendo que n
se constituya en el padre de los nodos n1, n2, …..,nk .En dicho árbol, n es la raíz y
A1, A2, …….,Ak son los subárboles de la raíz. Los nodos n1, n2, …..,nk reciben el
nombre de hijos del nodo n.

Observe que la definición anterior muestra claramente las dos partes mínimas que
definen un algoritmo recursivo, el ítem 1 se constituye en el caso BASE y el ítem 2 se
constituye en el caso RESURSIVO.

Un árbol nulo es un árbol sin nodos y se representa por L.

Camino en un árbol, es una sucesión de nodos n1, n2, … , nk de tal forma que ni es el
padre de ni+1 para 1 £ i £ k , en este caso existe un camino valido del nodo n1 al nodo
nk .
La longitud de un camino es el numero de nodos del camino menos 1.
La altura de un nodo en un árbol es la longitud del camino mas largo de ese nodo a
una hoja.
La altura de un árbol es la altura de la raíz.
La profundidad de un nodo es la longitud del camino único desde la raíz a ese nodo.
Por ejemplo, para el árbol de la figura:

Un camino valido de; árbol es: < A, C, H, N > el camino del nodo A al nodo B, se
cumplen las propiedades de un camino que A es padre de C, C es padre de H y H es
padre de N.
La longitud del camino anterior es 3 o sea 4 nodos que contiene el camino menos 1.
La altura del nodo B es de 2 o sea la longitud del camino <B, F, L> que lleva a de B a
una hoja mas lejana posible L (la otra hoja podría ser K).
La altura del árbol es 4 o sea la longitud del camino <A, C, H, O, P>, que inicia en el
nodo raíz y llega a una hoja lo mas lejana posible P (podría ser Q también).
La profundidad del nodo N es 3 o sea la longitud del camino <A, C, H, N> que va desde
la raíz al nodo N.

Recorridos en arboles

Existen varias maneras de recorrer todos los nodos de un árbol ( sin repetición ).
Los tres recorridos mas importantes se llaman recorrido en orden previo (preorder),
recorrido orden simétrico (inorder) y recorrido en orden posterior (postorder).
Estos recorridos se definen recursivamente de la siguiente forma:
• Si un árbol A es nulo, entonces una lista vaciá es el resultado de los recorridos
en ordenes previo, simétrico y posterior.
• Si A contiene un solo nodo, entonces ese nodo será el listado de los nodos de A
en los ordenes previo, simétrico y posterior.
Si ninguno de los anteriores es el caso entonces, se A un arbol con raiz n y subárboles
A1, A2, …..,Ak, como en la figura:

El recorrido en orden previo los nodos del árbol A esta formado por la raíz de A,
seguido de los nodos de A1, en orden previo, seguido de los nodos de A2 en orden
previo, y así sucesivamente hasta los nodos de Ak en orden previo.

ORDEN_PREVIO(A) = n, ORDEN_PREVIO(A1), ORDEN_PREVIO(A2), ……., ORDEN_PREVIO(Ak)


El recorrido en orden simétrico de los nodos de A, esta compuesto por los nodos de A1
en orden simétrico, seguido de la raíz del árbol A, seguido luego por los nodos de
A2,……., Ak todos en orden simétrico.

ORDEN_SIMETRICO(A) = ORDEN_SIMETRICO(A1), n, ORDEN_SIMETRICO(A2), …. , ORDEN_SIMETRICO(Ak)

EL recorrido en orden posterior de los nodos de A tiene los nodos de A1 en orden


posterior, luego los nodos de A2 en orden posterior y así sucesivamente hasta los
nodos de Ak en orden posterior y por ultimo la raíz del árbol A.

ORDEN_POSTERIOR(A) = ORDEN_POSTERIOR(A1), ORDEN_POSTERIOR(A2), …., ORDEN_POSTERIOR(Ak), n

Por ejemplo, en el árbol de la figura sus recorridos serian:

En orden previo: < A,B,E,F,K,L,C,G,H,M,N,O,P,Q,D,I,J >


En orden simétrico: < E,B,K,F,L,A,G,C,M,H,N,P,O,Q,I,D,J >
En orden posterior: < E,K,L,F,B,G,M,N,P,Q,O,H,C,I,,J,D,A>

Algoritmo recursivo para el recorrido en orden Previo

Procedimiento ORD_PRE(n : nodo)


Inicio
Imprime n
Para cada hijo c de n, si los hay, en orden desde la izquierda haga
ORD_PRE(c)
Fin ORD_PRE

Algoritmo recursivo para el recorrido en orden Simétrico

Procedimiento ORD_SIM (n : nodo )


Inicio
Si n es una hoja entonces
Imprime n
Sino
Inicio
ORD_SIM(hijo de n mas a la izquierda)
Imprime n
Para cada hijo c de n, excepto el de mas a la izquierda, en orden desde
la izquierda haga
ORD_SIM(c)
Fin
Fin
TDA ARBOL

Al igual de la las Lista, Pilas y Colas los arboles son considerados TDA’s, y por lo tanto
están conformados de dos partes:

• Espacio de Almacenamiento (Estructura de Datos).


• Operaciones para manipular los datos Almacenados.

Las estructuras de datos mas utilizadas para contener la información de un árbol son:

• Arreglos
• Listas de hijos
• Estructura de registros hijo_mas_izquierdo / hermano_derecho.

Consideremos que existe un árbol al que llamaremos A, entonces las operaciones


básicas de arboles:

1. PADRE(n) Esta operación retorna el padre del nodo n en el arbola A. Si n es la


raíz, que no tiene padre, la operación retorna L árbol nulo, desde este
contexto se usa como señal que se ha salido del árbol.
2. HIJO_MAS_IZQ(n) Retorna el hijo mas a la izquierda del nodo n en el árbol A y
retorna L si n es una hoja y por tanto no tiene hijos.
3. HERMANO_DER(n) devuelve el hermano a la derecha del nodo n en el árbol A,
si no hay hermano derecho retorna L.
4. ETIQUETA(n) retorna una copia del dato almacenado en el nodo n del árbol A.
5. RAIZ() devuelve el nodo raíz del árbol A o L si A es un árbol nulo ( no tiene
nodos ).
6. ANULA() convierte el árbol A en un árbol nulo, elimina todos los nodos del
árbol.
7. CREAi(v, A1, A2, …., Ai) la operación es parte de un conjunto infinito de
operaciones una para cada valor de i = 0,1,2, ….. . CREAi crea un nuevo nodo r
con valor v y le asigna i hijos que son las raíces de los arboles A1, A2, …., Ai en
ese orden de izquierda a derecha. La operación retorna el árbol con raíz r. Si i =
0, entonces r es a la vez una hoja y raíz del nuevo árbol.

Funcionamiento de CREAi, dado el siguiente árbol:

Utilizaremos las Operaciones CREAi necesarias para crear el árbol de la figura

CREA3(‘A’, CREA2(‘B’, CREA0(‘E’), CREA0(‘F’)), CREA2(‘C’, CREA0(‘G’), CREA0(‘H’)), CREA2(‘D’, CREA0(‘I’), CREA0(‘J’)))
Inicialmente se usa la operación CREA3 debido a que la raíz A tiene 3 hijos, que a su
vez tienen dos hijos cada uno se utiliza por esta razón operaciones CREA2, y finalmente
cada una de los nodos hijos de los nodos B,C,D se crean utilizando operaciones CREA0
ya que ninguno de ellos tiene hijos ( son nodos hoja ).

Uso de las operaciones de árbol para crear algoritmos.

Para mostrar el uso de las operaciones de árbol y seudocódigo crearemos un algoritmo


recursivo para realizar un recorrido en orden previo de un árbol A.

Procedimiento ORD_PRE(n : nodo) // imprime los datos de los descendientes de n en orden previo
c : nodo
Inicio
listar A.ETIQUETA(n)
c := A.HIJO_MAS_IZQ(n)
mientras c <> L haga
Inicio
A.ORD_PRE(c)
C := A.HERMANO_DER(c)
Final
Final ORD_PRE

Implementación de un Árbol utilizando la estructura de Arreglo


HIJO_MAS_IZQUIERDO / HEMANO_DERECHO

De la misma forma que se utilizo una estructura de arreglo < DATO, SIGUIENTE > para
almacenar una LISTA, se puede utilizar un arreglo de registros para almacenar un árbol
e implementar sus operaciones, para una mayor comprensión consideremos el
siguiente ejemplo:

Utilizar una estructura HIJO_MAS_IZQUIERDO / HEMANO_DERECHO para almacenar y


representar el siguiente árbol:

La representación quedaría de la siguiente manera:


La estructura esta compuesta de una variable RAIZ de tipo entera que almacena el
índice (cubeta) del arreglo en donde se almacena la información del nodo raíz del
árbol, también esta compuesta de un arreglo de registros con los siguientes
elementos:

• HIJO_MAS_IZQUIERDO de tipo entero, almacena el índice (cubeta) del arreglo a


donde se almacena nodo hijo mas a la izquierda.
• DATO el tipo será definido por el tipo de dato almacenado en el nodo, para el
ejemplo el tipo es char debido a que el árbol almacena en sus nodos caracteres.
• HERMANO_DERECHO de tipo entero, almacena el índice (cubeta) del arreglo a
donde se almacenará el nodo hermano derecho.

El tamaño del arreglo dependerá de la cantidad máxima de nodos que habrá en el


árbol a representar, para el caso del ejemplo el arreglo es de tamaño 10 mas que
suficiente para almacenar el árbol planteado.

También podría gustarte