Sie sind auf Seite 1von 6

ÁRBOLES. ÁRBOLES BINARIOS.

Hasta ahora nos hemos dedicado a estudiar TADes que de una u otra forma eran de
naturaleza lineal, o unidimensional. En los tipos abstractos de datos lineales existen
exactamente un elemento previo y otro siguiente (excepto para el primero y el último,
si los hay); en las estructuras no lineales, como conjuntos o árboles, este tipo de
secuencialidad no existe, aunque en los árboles existe una estructura jerárquica, de
manera que un elemento tiene un solo predecesor, pero varios sucesores.

Una exploración algo amplia en el campo de la ciencia de la computación nos lleva a


situaciones en que las representaciones lineales son inadecuadas, tanto en sentido
conceptual como práctico. Un paso importante lo representan los árboles binarios, y el
siguiente vendrá dado con el estudio de la noción general de árbol.

Un árbol impone una estructura jerárquica sobre una colección de objetos. Ejemplos
claros de utilización de árboles se presentan tanto dentro como fuera del área de
computación (índices de libros, árboles genealógicos, etc.); en Informática constituyen
una de las estructuras más utilizadas, con aplicaciones que van desde los árboles
sintácticos utilizados para la representación y/o interpretación de términos de un
lenguaje o expresiones aritméticas, pasando por los arboles de activación de
procedimientos recursivos, hasta la representación de datos que se desea mantener
ordenados con un tiempo de acceso relativamente bajo. En general, se usarán árboles
siempre que se quiera representar información jerarquizada, cuando esta converja en
un solo punto.

ARBOLES Y SUS PROPIEDADES


Intuitivamente, podemos visualizar árboles como una forma de organizar información
deforma jerárquica, con un único punto de entrada y una serie de caminos que van
abriéndose encada punto hacia sus sucesores. Desde un punto de vista formal (teoría
de conjuntos), un árbol se puede considerar como una estructura A = (N, y),
constituida por un conjunto, N, cuyos elementos se denominan nodos, y una relación
de orden parcial transitiva, y, definida sobre N, y caracterizada por la existencia de:

- Un elemento mínimo (anterior a todos los demás) único, la raíz

Documento creado por: Edgar Phye


Un predecesor único para cada nodo p distinto de la raíz, es decir, un nodo, q, tal que q
y p y para cualquier nodo q' con las mismas características se cumple q' y q.

Los ascendientes de un nodo se definen como el conjunto formado por su predecesor


único y los ascendientes de éste, cuando estos existan: Asc(n) = {m: m < n}. Antepasado
y ancestro suelen ser utilizados como sinónimos de ascendiente.

Los descendientes de un nodo se definen como el conjunto formado por todos aquellos
nodos que lo tienen en su conjunto de ascendientes:

Esta estructura se puede considerar una estructura recursiva teniendo en cuenta que
cada nodo del árbol, junto con todos sus descendientes, y manteniendo la ordenación
original, constituye también un árbol o subárbol del árbol principal, característica esta
que permite definiciones simples de árbol, más apropiadas desde el punto de vista de la
teoría de tipos abstractos de datos, y, ajustadas, cada una de ellas, al uso que se vaya a
hacer de la noción de árbol.

Las dos definiciones más comunes son las de árbol general y la de árbol de orden N, que
se pueden dar en los términos siguientes:

Un árbol general con nodos de un tipo T es un par (r, LA) formado por un nodo r (la raíz)
A

y una lista (si se considera relevante el orden de los subárboles) o un conjunto (si éste
es irrelevante) L (bosque), posiblemente vacío, de árboles generales del mismo A tipo
(subárboles de la raíz). Vemos que aquí no existe el árbol vacío, sino la secuencia vacía
de árboles generales.

Un árbol de orden N (con N >= 2), con nodos de tipo T, es un árbol vacio () o unpar (r, L A
) formado por un nodo r (la raíz) y una tupla L (bosque) formada por N árboles A del A

mismo tipo (subárboles de la raíz). Este último caso suele escribirse explicitamente dela
forma (r, A1, ..., AN ).

Los nodos se clasifican dependiendo de su posición dentro del árbol en:

Raíz: Elemento mínimo de un árbol.

Documento creado por: Edgar Phye


Nodo intermedio: Cualquier nodo predecesor de una hoja, y sucesor de la raíz.

Nodo terminal u hoja: Nodo que no tiene sucesores.

También los podemos dividir en:Nodo interno: Cualquier nodo del árbol.Nodo externo:
Son los árboles vacíos que penden de los nodos que no tienen todos sus hijos, (enlos
árboles de orden N). Se representa por .

Conceptos más importantes son:

Padre: Predecesor máximo de un nodo.

Hijo: Cualquiera de los sucesores directos de un nodo

Hermano: Cualquier otro nodo hijo de un mismo padre.

En esta página se describen algunos algoritmos que permiten obtener la representación en arbol binario de una
expresión matemática partiendo de la lista de términos que la componen expresados en la notación habitual
(notación infija).

1. Introducción
Para nuestro problema una expresión matemática será un medio que permite indicar el orden en que se deben
realizar una serie de operaciones para obtener un resultado. Las operaciones se indican mediante operadores,
que en nuestro caso representan las operaciones sumas, resta, producto, división e igualdad, todas ellas
operaciones binarias (necesitan exactamente dos argumentos para poderse evaluar).

Existen varias notaciones para representar expresiones matemáticas, que se diferencian en el orden en que se
escriben los argumentos (operandos) de los operadores. Las más relevantes son:

 Notación infija: La notación habitual. El orden es primer operando, operador, segundo operando.
 Notación prefija: El orden es operador, primer operando, segundo operando.
 Notación postfija: El orden es primer operando, segundo operando, operador.
 Notación funcional: Se escribe el operador/función y después, entre paréntesis, los operadores
separados por comas.

La notación infija tiene el problema de que en expresiones con más de un operador existe ambigüedad sobre
cuál es el orden de evaluación. Por ejemplo, la expresión 8/4/2 se puede interpretar como (8/4)/2 o bien como
8/(4/2). Las otras notaciones no sufren este problema.

Para resolver estas ambigüedades, se añaden unas reglas denominadas orden de precedencia de operadores.
Cuando dos operadores compiten por el mismo operando (en el ejemplo anterior, el primer y el segundo

Documento creado por: Edgar Phye


operador de división se disputan el operando 4) gana el el operador (se evalúa primero) con mayor
precedencia, o a igualdad de precedencia, el operador situado más a la izquierda.

Las reglas de precedencia habituales son que los operadores división y producto tienen igual precedencia y
ganan al resto de operadores, y que el operador suma y resta tienen igual precedencia y ganan al operador
igualdad.

Así, la expresión 8/4/2 se evalúa como (8/4) /2, y 2+3*4 se evalúa como 2+(3*4). Si deseamos cambiar el
orden de evaluación, se pueden agrupar partes de una expresión utilizando paréntesis. En el resto de las
notaciones no es necesario utilizar paréntesis ya que siempre podemos indicar el orden exacto de evaluación
sin que exista ambigüedad.

Por ejemplo, si deseamos representar las expresiones (2+(3*4)) = x y ((2+3) *4)= x en las cuatro notaciones
mencionadas, el resultado sería:

(2+(3*4)) = x ((2+3)*4) = x
Notación prefija =+2*34x =*+234x
Notación infija 2+3*4 = x (2+3)*4 = x
Notación postfija 234*+x= 23+4*x=
Notación funcional igual(suma(2,producto(3,4)),x) igual(producto(suma(2,3),4),x)

Generalmente a la hora de traducir una expresión en notación infija a su representación como arbol binario se
suele efectuar un primer paso de traducción a una notación más adecuada (generalmente a notación prefija o
postfija), y luego se traduce la expresión en esa notación a arbol binario.

Las dos etapas anteriores se pueden realizar directamente mediante un algoritmo recursivo, o en dos pasos
utilizando estructuras adicionales (generalmente pilas).

2. Algoritmo recursivo
Es posible traducir directamente una expresión en notación infija a un árbol binario mediante uno o varios
subprogramas recursivos, aunque el algoritmo no es trivial. En lugar de intentar desarrollar un único
subprograma que analice completamente una expresión, suele ser más sencillo utilizar un enfoque ligeramente
distinto, utilizando dos subprogramas:

 El primero de ellos se encargaría de asignar el operando derecho a un operador, el cual se proporciona


como un árbol binario al que le falta el hijo derecho, utilizando para ello la lista de términos
correspondiente a la parte de la expresión que falta por traducir. El resultado del subprograma será el
árbol binario completado y la lista de términos que faltan por analizar.
 El segundo subprograma traduce parte o toda una expresión en un arbol binario, que pasa a
considerarse como operando. Una expresión en notación infija responde al esquema N1 O1 N2 O2 N3...,
donde los términos Ni son operandos y los términos Oi operadores. Este subprograma construiría el
árbol binario asignando N1 como operando izquierdo de O1, y llamaría al subprograma anterior para
encontrar el operando derecho de O1. Por ejemplo, en la expresión 2*3+4, el operando derecho del
producto es 3, pero en la expresión 2+3*4 el operando derecho de la suma es el árbol binario (3*4).

Documento creado por: Edgar Phye


 Si en algún momento aparece un paréntesis izquierdo en lugar de un operando, se llamaría al segundo
subprograma para que traduzca esa sobrexpresión al árbol binario correspondiente, que pasa a
considerarse como el operando que faltaba.

3. Conversión de notación infija a postfija


El siguiente algoritmo en pseudocódigo traduce una expresión en notación infija a notación postfija, como
paso previo a la obtención del árbol binario correspondiente a la expresión:

 Entrada: Una lista que contiene los términos de la ecuación en notación infija (la notación habitual).
 Salida: Una lista que contiene los términos de la ecuación en notación postfija.
 Datos locales: Una pila, que va a contener operadores y paréntesis izquierdos.

INICIO
Crear pila y la lista de salida, inicialmente vacías.
MIENTRAS lista de entrada no este vacía y
no se ha encontrado ningún error HACER
Extraer el primer término de la lista (lo llamaremos E)
SEGUN-SEA E
CASO E es número:
Insertar E al final de la lista de salida
CASO E es la variable x:
Insertar E al final de la lista de salida
CASO E es un paréntesis izquierdo:
Insertar E en la pila
CASO E es un paréntesis derecho:
MIENTRAS La pila no este vacía y
su cima no sea un paréntesis izquierdo HACER
Extraer elemento de la pila
Insertarlo al final de la lista de salida
FIN-MIENTRAS
SI Encontramos el paréntesis izquierdo ENTONCES
Extraerlo de la pila y destruirlo
SINO
Se ha detectado un ERROR 2
FIN-SI
Destruir E
CASO E es un operador:
MIENTRAS La pila no este vacía y su cima sea un operador de precedencia mayor
o igual que la de E HACER
Extraer elemento de la pila
Insertarlo al final de la lista de salida
FIN-MIENTRAS
Insertar E en la pila
FIN-SEGUN-SEA
FIN-MIENTRAS
MIENTRAS Pila no esté vacía HACER
Extraer elemento de la pila
Insertarlo al final de la lista de salida
FIN-MIENTRAS
Destruir pila
FIN

A continuación, se muestra el estado de la lista de entrada, la lista de salida y la pila en cada iteración del
bucle principal del algoritmo al dar como entrada la lista de términos correspondiente al ejemplo del
Documento creado por: Edgar Phye
enunciado de la práctica. En color rojo se muestra el término que se procesa en cada iteración, y en color
verde los términos que se han añadido a la lista de salida o a la pila como consecuencia de las acciones
realizadas en la iteración anterior:

Documento creado por: Edgar Phye

Das könnte Ihnen auch gefallen