Arboles
Arboles
Arboles
Introducción
El árbol es una estructura de datos muy importante en informática y en ciencias de
la computación. Los árboles son estructuras no lineales, al contrario que los arrays
y las listas enlazadas, que constituyen estructuras lineales.
Definición 1
Un árbol consta de un conjunto finito de elementos, denominados nodos y de un
conjunto finito de líneas dirigidas, denominadas ramas, que conectan los nodos. El
número de ramas asociado con un nodo es el grado del nodo.
Definición 2
Un árbol es un conjunto de uno o más nodos tales que:
1. Hay un nodo diseñado especialmente llamado raíz.
2. 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.
Además del nodo raíz, existen muchos términos utilizados en la descripción de los
atributos de un árbol. En la Figura, el nodo A es la raíz. Utilizando el concepto de
árboles genealógicos, un nodo puede ser considerado como padre si tiene nodos
sucesores.
Estos nodos sucesores se llaman hijos. Por ejemplo, el nodo B es el padre de los
hijos E y F. El padre de H es el nodo D. Un árbol puede representar diversas
generaciones en la familia. Los hijos de un nodo y los hijos de estos hijos se llaman
descendientes, y el padre y los abuelos de un nodo son sus ascendientes. Por
ejemplo, los nodos E, F, I y J son descendientes de B. Cada nodo no raíz tiene un
único padre. Dos o más nodos con el mismo padre se llaman hermanos. Un nodo
sin hijos, tal como E, I, J, G y H se llama nodo hoja.
El nivel de un nodo es su distancia al nodo raíz. La raíz tiene una distancia cero de
sí misma, por ello se dice que está en el nivel 0. Los hijos del nodo raíz están en el
nivel 1, sus hijos están en el nivel 2, y así sucesivamente. Una cosa importante que
se aprecia entre los niveles de nodos es la relación entre niveles y hermanos. Los
hermanos están siempre al mismo nivel, pero no todos los nodos de un mismo
nivel son necesariamente hermanos.
Un camino es una secuencia de nodos en los que cada nodo es adyacente al
siguiente. Cada nodo del árbol puede ser alcanzado (se llega a él) siguiendo un
único camino que comienza en el nodo raíz. En la Figura anterior, el camino desde
la raíz a la hoja I, se representa por AFI. Incluye dos ramas distintas AF y FI.
La altura o profundidad de un árbol es el nivel de la hoja del camino más largo
desde la raíz más uno. Por definición, la altura de un árbol vacío es 0. La Figura
anterior contiene nodos en tres niveles: 0, 1 y 2. Su altura es 3.
Resumen de definiciones:
• El primer nodo de un árbol, normalmente dibujado en la posición superior, se
denomina raíz del árbol.
• Las flechas que conectan un nodo con otro se llaman arcos o ramas.
• Los nodos terminales, esto es, nodos de los cuales no se deduce ningún nodo, se
denominan hojas.
• Los nodos que no son hojas se denominan nodos internos.
• En un árbol donde una rama 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.
• n1 se llama ascendiente de n2 si n1 es el padre de n2 o si n1 es el padre de un
ascendiente de n2.
• n2 se llama descendiente de n1 si n1 es un ascendiente de n2.
• Un camino de n1 a n2 es una secuencia de arcos contiguos que van de n1 a n2.
• 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.
• El nivel de un nodo es la longitud del camino que lo conecta al nodo raíz.
• La profundidad o altura de un árbol es la longitud del camino más largo que
conecta el raíz a una hoja.
• 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.
• 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.
ÁRBOLES BINARIOS
Un árbol binario es un árbol cuyos nodos no pueden tener más de dos subárboles.
En un árbol binario, cada nodo puede tener cero, uno o dos hijos (subárboles). Se
conoce el nodo de la izquierda como hijo izquierdo y el nodo de la derecha como
hijo derecho.
El último caso de árbol es un tipo especial, denominado árbol degenerado, en el que hay un
solo nodo hoja (E) y cada nodo no hoja sólo tiene un hijo. Un árbol degenerado es equivalente a
una lista enlazada.
TAD Árbol binario
La estructura de árbol binario constituye un tipo abstracto de datos; las
operaciones básicas que definen el TAD árbol binario son las siguientes:
Tipo de dato Dato que se almacena en los nodos del árbol.
Operaciones
CrearArbol Inicia el árbol como vacío.
Construir Crea un árbol con un elemento raíz y dos ramas,
izquierda y derecha que son a su vez árboles.
EsVacio Comprueba si el árbol no tiene nodos.
Raiz Devuelve el nodo raíz.
Izquierdo Obtiene la rama o subárbol izquierdo de un árbol
dado.
Derecho Obtiene la rama o subárbol derecho de un árbol
dado.
Borrar Elimina del árbol el nodo con un elemento
determinado.
Pertenece Determina si un elemento se encuentra en el árbol.
Un árbol binario se construye con nodos. Cada nodo debe contener el campo dato
(datos a almacenar) y dos campos de enlace (apuntador), uno al subárbol izquierdo
(izquierdo, izdo) y otro al subárbol derecho (derecho, dcho). El valor null indica
un árbol o un subárbol vacío.
La Figura muestra la representación enlazada de dos árboles binarios de raíz A. El
primero es un árbol degenerado a la izquierda; el segundo es un árbol binario
completo de profundidad 4.
Se puede observar que los nodos de un árbol binario que son hojas se caracterizan
por tener sus dos campos de enlace a null.
Representación de un nodo
La clase Nodo agrupa a todos los campos de que consta: dato, izdo (rama
izquierda) y dcho (rama derecha). Además, dispone de dos constructores; el
primero inicializa el campo dato a un valor y los enlaces a null, en definitiva, se
inicializa como hoja y el segundo inicializa dato a un valor y las ramas a dos
subárboles.
Creación de un árbol binario
A partir del nodo raíz de un árbol se puede acceder a los demás nodos del árbol,
por ello se mantiene la referencia a la raíz del árbol. Las ramas izquierda y derecha
son, a su vez, árboles binarios que tienen su raíz, y así recursivamente hasta llegar
a las hojas del árbol. La clase ArbolBinario tiene el campo raiz, un constructor que
inicializa raiz y métodos para implementar las operaciones.
El método nuevoArbol() crea un árbol de raíz un nodo con el campo dato, rama
izquierda y derecha pasadas en los argumentos.
ÁRBOL DE EXPRESIÓN
Una aplicación muy importante de los árboles binarios son los árboles de
expresiones. Una expresión es una secuencia de tokens (componentes de léxicos
que siguen unas reglas establecidas). Un token puede ser un operando o bien un
operador.
Soluciones
a) X * Y /(-Z)
b) A + B * (-(C + D))
c) A * (X + Y)) * C
Ejemplo
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
Reglas para la construcción de árboles de expresiones