Está en la página 1de 9

Estructura de la información

1  Introducción

En su aspecto más general, el arte de la programación de ordenadores tiene mucho que ver
con eso que llamamos la "inteligencia" humana; los procesos de abstracción; la capacidad de
imaginar un problema y sus posibles soluciones (hemos dicho que programar es formular la
solución de un problema). El proceso suele ir de lo general a lo particular y viceversa (de las
ideas abstractas a los detalles concretos), en un proceso que se realimenta constantemente.

En una primera fase, el programador concibe una imagen del problema (el primer paso es
"comprender el problema"), sin embargo, para formular la solución, se necesita un vehículo o
soporte sobre el que construirla. En nuestro caso conocer un lenguaje de programación, lo que
en el fondo tiene un doble sentido: el primero y más importante, es conocer que herramientas
ofrece. Estas herramientas funcionan como ideas-soporte; como ladrillos con los que construir
la solución como si fuese una construcción material. Esto significa sobre todo, que el
programador piensa en función de las herramientas disponibles. Sin ellas es incapaz de
imaginarse ninguna solución concreta. El segundo significado es mucho menos importante
(conceptualmente hablando); supone el conocimiento de una serie de reglas formales de
utilización de los elementos del lenguaje. Sería la fase de mera codificación, tarea para la que
existen herramientas cada vez más eficaces. Por ejemplo, la amplia colección de herramientas
RAD [1] que componen las modernas "suites" de desarrollo.

La situación es comparable a la de un hipotético Robinsón que en una isla desierta tuviese que
resolver el problema de su alojamiento. Tiene conciencia del problema y de su solución en
abstracto: "un refugio". Sin embargo, para pensar algo concreto necesita antes explorar la isla,
conocer que posibilidades ofrece. ¿Existen cuevas naturales?, ¿Madera?, ¿Restos de
naufragios? ¿Algo que pueda adaptarse? etc. Evidentemente la forma mental de su refugio
dependerá de los medios disponibles; posteriormente, la construcción en sí, será cuestión de
detalle y de su propia habilidad manual.

2  Datos y algoritmos

En informática, las ideas-soporte a que aludíamos son principalmente de dos tipos: Relativas a
la información y a su manipulación (los datos y los algoritmos respectivamente).

En lo que concierne a los primeros (los datos), existen multitud de formas de organizarlos;  a
estas formas las denominamos estructuras de datos. En cuanto a los segundos, existen un
número casi infinito de algoritmos, pero en lo que aquí nos ocupa, tienen especial importancia
los relacionados con el acceso a la información, es decir, los relacionados con su
almacenamiento y recuperación. Algoritmos que Shildt denomina mecanismos de datos..
Generalmente se considera que estos mecanismos realizan tres tipos de operaciones:  
Inserción, borrado y búsqueda de la información en la estructura correspondiente.

Las estructuras y mecanismos de datos han sido muy estudiados;  constituyen en sí mismos
dos mundos dentro de la informática, y dado que son las herramientas para construir un
programa, además de la experiencia, es conveniente disponer del conjunto más completo
posible de ellas (en este aspecto la programación se parece al bricolaje). Por ejemplo, si nos
referimos a los algoritmos, los métodos de ordenación ("Sort") o de construcción de índices
(que viene a ser equivalente), han sido muy estudiados, de forma que se conoce cuales son los
más eficientes para cada caso (algunos incluso patentados). Si el lenguaje no los tiene
preconstruidos, tendremos que fabricarlos manualmente con los medios disponibles. En este
aspecto, un lenguaje es tanto mejor cuanto más abstractas sean las herramientas que nos
ofrezca (estructuras y mecanismos de datos). Lo que significa que estarán más cercanas a la
idea que tiene en mente el programador-humano y más alejadas de la forma concreta que
adoptarán en la máquina. Este es precisamente el significado de la expresión "Lenguaje de alto
o bajo nivel", el mayor o menor grado de proximidad que ofrezcan sus herramientas con las
ideas (abstracciones) en la mente humana.

Al abordar un problema y decidirse por una estructura o mecanismo de datos concreto, hay un
aspecto importante que debe ser conocido y tenido en cuenta por el programador. Es el hecho
de que unas estructuras son más adecuadas para determinados mecanismos que otras. Dicho
en otras palabras:  las relaciones entre las estructuras de datos y los algoritmos que las
manipulan son muy significativas. Por ejemplo:  determinadas estructuras son muy adecuadas
para operaciones de inserción y recuperación, de forma que los algoritmos que realizan estas
operaciones son muy simples y rápidos. En cambio estas mismas estructuras pueden ser
inadecuadas para buscar información en su interior. Resulta por tanto, que la relación de cada
tipo de estructura de datos con los mecanismos básicos, inserción, borrado y búsqueda, es
muy diferente, y debemos pensar detenidamente que relación tiene nuestra estructura con los
mecanismos básicos (como la usaremos).

Tanto las estructuras como los mecanismos de datos son importantes. De hecho, en el diseño
de programas caben dos enfoques, según las consideraciones iniciales consideren prioritarias
a unas u otros. En algunos casos la elección de la estructura de datos es el primer
considerando del diseño, ya que la experiencia ha indicado que el trabajo total de desarrollo y
la calidad del resultado dependen grandemente de la idoneidad de las estructuras utilizadas.
Una vez elegidas, la elección del mecanismo es una consecuencia directa de la decisión
anterior. En otros casos la línea de razonamiento sigue el camino inverso; se deciden las
estructuras porque ciertas operaciones críticas utilizan algoritmos que funcionan mejor en esas
estructuras.

La preponderancia de uno u otro criterio se deja sentir incluso en el diseño de los lenguajes de
programación e incluso de los sistemas operativos . Los lenguajes orientados a objetos (como
C++) están diseñados alrededor del concepto estructura de los datos, mientras en otros, por
ejemplo Lisp, el diseño se centra en el aspecto algorítmico. Al tratar de las plantillas
("Templates"), se comenta más ampliamente la relación entre datos y algoritmos .

3 Estructura  Física y estructura Lógica

Al tratar de las estructuras y contenedores de datos, es conveniente tener algunas ideas


básicas claras y precisas sobre los mecanismos involucrados.

La estructura lógica se corresponde con la idea que en principio tiene el programador sobre
como están organizados los datos, y coincide aproximadamente con la forma en que son
manipulados los datos por el programa de alto nivel.

En la concepción de la estructura lógica, el programador puede razonar más o menos en los


siguientes términos:  "Voy a crear un fichero de clientes donde los datos de cada cliente
estarán agrupados en un registro. Posteriormente accederé los registros por número de cliente
(que será único) o por nombre, para lo que estarán ordenados alfabéticamente (construiré un
índice con el código de cliente y otro de nombres)...".   Si está habituado a la programación de
bases de datos con herramientas de alto nivel, quizás su razonamiento sea el siguiente:  "Voy a
crear una tabla de clientes donde incluiré los datos de cada cliente, comenzando por una
columna para el código que será el índice principal (será un INT UNSIGNED).  También crearé
un campo "nombre" que será un VCHAR NOT NULL UNIQUE...".

En uno u otro caso, la estructura (se llame "fichero" o "tabla") es una unidad lógica que se
compone una multitud de elementos individuales (se llamen "registros" o "filas" -según la
cultura del programador-). La estructura así concebida tiene un orden, ya que sus elementos
estarán conceptualmente uno detrás de otro. Este orden será numérico, si el acceso se realiza
por código de cliente, o alfabético de nombres si el acceso se realiza por nombre. A su vez,
esta estructura lógica se divide aún más finamente:  cada elemento se puede considerar
dividido en multitud de campos. Aparte de los ya mencionados para código de cliente y nombre,
pueden existir muchos mas:  dirección, teléfono, saldo, clasificación financiera, fecha última
compra, vendedor asignado, etc. etc.

Por su parte, la estructura física corresponde a la forma en que están contenidos los datos en
la máquina, de la que existen dos versiones:  una corresponde a la que adoptan los datos en
memoria;  la otra a su almacenamiento externo (disco). Ambos esquemas son distintos.

Resulta evidente que la estructura física de datos en los almacenamientos externos no se


corresponde exactamente con estructura lógica. En principio, el fichero o tabla de clientes antes
mencionado, puede estar representado físicamente por varios ficheros que pueden ser multi-
volumen. Es decir: ocupar más de un volumen lógico en la máquina que los alberga. Si son
aplicaciones de red, pueden estar incluso en máquinas remotas, distintas de la que ejecuta la
aplicación. Además, aunque nos figuramos la estructura lógica es un todo continuo
(suponemos que después de un cliente sigue otro), sabemos que la estructura física
correspondiente, incluso si se trata solo de un fichero, está compuesta por trozos "clusters" que
pueden estar dispersos en el disco.

La estructura lógica está ordenada (por números o por nombres en nuestro ejemplo). En
cambio, la estructura física puede estar construida simplemente por el orden "natural" es decir,
de creación de los propios registros. Generalmente, la "apariencia" de ordenación es el
resultado de un proceso complejo que utiliza índices, tablas y punteros, para proporcionarnos
un acceso ordenado a una estructura mucho más caótica.

Como queda dicho, los datos son manejados por el programador y el programa (que es la
expresión concreta de las ideas de aquel) en términos de esta estructura lógica. En lo tocante a
este aspecto, las herramientas que ofrezca el lenguaje o entorno de programación, serán de
mayor nivel cuanto mayor sea la distancia con que pueda ser manejada la estructura lógica de
datos respecto de su verdadera estructura física.  Precisamente el manejo de tales estructuras
("Databases"), ha originado toda una rama de la industria del software que ha alcanzado un
alto nivel de sofisticación y especialización. En proyectos grandes es usual manejar los datos a
través de estas herramientas. En estos casos el lenguaje C++ las utilizaría a través de
interfaces.  Por ejemplo, interfaces con motores relacionales (SQL). Sin embargo, es rara la
aplicación en que el programador no deba manejar uno o varios ficheritos (por ejemplo con
parámetros de configuración), a un nivel "relativamente" bajo, haciendo uso de las
herramientas (relativamente simples) que ofrece la Librería Estándar. También es usual que
deba manejar, también a bajo nivel, alguna estructura de datos en memoria, por ejemplo una
matriz, mediante técnicas totalmente distintas de las que se utilizarían con un fichero de disco.

Como resumen, podemos afirmar que el programador, al menos el programador C++, puede
concentrarse en la estructura lógica, pero sin olvidar de vez en cuando mirar la estructura física
con el rabillo del ojo. Como hemos señalado antes, existen distintos tipos de estructuras de
datos (lógicas y físicas) que se diferencian grandemente en su grado de adecuación a diversas
formas de almacenamiento y recuperación de la información, por lo que es conveniente que el
programador tenga ciertas nociones al respecto.
4 Estructuras lógicas

Al pensar en un "contenedor" de información la idea más simple es la de un saco que lo


contenga todo, pero es fácil intuir que esta forma no es demasiado adecuada para recuperar la
información. El cajón de sastre puede ser cómodo para almacenar, no para recuperar.

Desechada la anterior, la segunda idea sería tratar de almacenar juntos datos homogéneos
(aunque no hay inconveniente teórico para que los tales datos sean todo lo complejos que se
desee). Por ejemplo, en una aplicación real se almacenarían separadamente los datos de
clientes; de proveedores, de artículos, etc. A su vez cada uno de estos almacenamientos
tendrían información compleja aunque relacionada. Por ejemplo, el fichero o tabla de clientes
contendría nombre, domicilio, teléfono, dirección, e-mail, web, etc de cada cliente. Lo mismo
con los proveedores, artículos, etc.

A estos conjuntos de datos que se almacenan juntos, los denominamos unidades de


almacenamiento (generalmente este es el enfoque utilizado).  Por ejemplo, siguiendo con el
supuesto anterior, almacenamos juntos los datos de clientes, y cada cliente es una unidad de
almacenamiento. Aunque pueda estar constituido a su vez por un conjunto muy grande de
datos, se graban o borran los datos de un cliente cada vez, esta unidad no es divisible (no
puede existir medio cliente, aunque algunos de sus registros si pueden estar vacíos).

Respecto como están relacionadas entre sí estas unidades de almacenamiento,  las


estructuras de datos comúnmente utilizadas son cuatro:  Colas;  Pilas;  Listas enlazadas y
Árboles que comentamos en este capítulo, y que con variaciones más o menos sofisticadas
dan origen a todas las demás.

4.1  Colas:

Las colas ("Queues") son sucesiones de registros contiguos


dispuestos de forma que es fácil añadir un nuevo elemento
(que se coloca después del último) y/o acceder o eliminar el
primero. La forma en que están construidas las hace
parecerse a una tubería, el primer agua que entra es la
primera que sale. Esta forma de acceder a la información se denomina FIFO ("First In First
Out") primero en entrar primero en salir.

Estas entidades corresponden a lo que en matemáticas se conoce como líneas de espera, y su


estudio teórico, conocido como teoría de colas, es muy importante en transporte y
telecomunicación (una modalidad de transporte). A título de curiosidad podemos citar que
incluso existe un lenguaje de programación denominado Oroogu, cuyo único tipo de datos es
una cola.

Sus características básicas pueden sintetizarse cuatro palabras:  datos contiguos, ordenación
FIFO.

4.2  Pilas:

Las pilas ("Stacks") son igualmente sucesiones de registros contiguos.


Podemos imaginar que se van "apilando" sucesivamente uno sobre el otro (de
ahí su nombre). Esta disposición hace que sea fácil añadir un nuevo elemento al
final, accederlo o eliminarlo. Esta forma de acceso a la información se denomina LIFO ("Last In
First Out") último en entrar primero en salir.

Podemos imaginar que tanto en las colas como en las pilas, insertar o eliminar un elemento
intermedio, es un proceso complicado si no imposible.

Sus características se resumirían en:  datos contiguos, ordenación LIFO.

4.3  Listas enlazadas

Las listas enlazadas ("Linked list") son conjuntos de


registros conceptualmente contiguos pero que
físicamente no tienen porqué estarlo (aunque lo normal
es que si lo estén); su orden lógico no tiene nada que
ver con el orden físico de los elementos en el conjunto.

El orden lógico se consigue porque cada elemento de la lista dispone de un puntero que señala
al próximo elemento. De esta forma la lista se mantiene ordenada, y es fácil recorrerla en
sentido ascendente. Para añadir un nuevo elemento solo hay que establecer en el último un
puntero que señale a la posición del nuevo elemento, que queda de este forma transformado
en el último.

En la figura anterior se ha representado una de estas


listas denominadas simplemente enlazadas.

Una variedad de la anterior la constituyen las listas


doblemente enlazadas. En este caso, cada elemento
dispone de dos punteros, uno al elemento siguiente y
otro al anterior. De esta forma la lista puede ser
fácilmente recorrida en ambos sentidos, ascendente y
descendente.

En este tipo de
arreglos es muy
sencillo insertar o eliminar un elemento en cualquier
posición, al principio, al final o intermedio, solo hay que
reorganizar los
punteros
adecuadamente
según se ve en
las figuras. Lo
normal es que
los punteros
acompañen a la información contenida en los propios
elementos, con lo que evidentemente, en cada
elemento, además de la información pertinente, según
el tipo de lista, debe existir espacio adecuado para uno
o dos punteros.

Las listas simple y doblemente enlazadas son ampliamente utilizadas. Por ejemplo, los
sistemas de ficheros de disco utilizan esta técnica para dar apariencia de continuidad a trozos
(clusters) físicamente dispersos en la superficie del disco que componen una sola unidad lógica
(fichero) .
Como se ha señalado, estas estructuras de datos son adecuadas cuando la información debe
mantenerse ordenada, y ser accedida de forma secuencial con posibilidad de insertar y eliminar
elementos en cualquier posición.

El tipo de ordenación puede ser cualquiera;  desde la denominada "natural", que es


simplemente la forma en que se han creado y destruido los elementos de la lista (los jóvenes al
final, los más viejos al principio), a cualquier otra basada en otro criterio. Por ejemplo alfabético,
según un campo alfanumérico que suponemos existe en cada elemento. En este caso, antes
de insertar un nuevo elemento hay que localizar la posición que le corresponde; esto solo
puede hacerse recorriendo secuencialmente la lista hasta encontrar la posición adecuada al
criterio de ordenación utilizado.

En cuanto a su idoneidad para buscar un elemento en su interior, el caso más desfavorable


supone tener que recorrer la totalidad de la lista antes de localizarlo, pero si utilizamos un
número suficientemente grande de datos aleatorios, el número de pasos necesario tiende a n/2,
lo que significa que por término medio debe recorrerse la mitad de los elementos de la lista
antes de encontrar el elemento.

4.4  Árboles

Los árboles son estructuras parecidas a las listas enlazadas, en el sentido que tienen
punteros que señalan 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 (ver
figura.  Su estudio desde el punto de vista matemático pertenece a la teoría de grafos;  desde
el punto de vista informático son estructuras de datos, lo que significa que cada elemento,
denominado nodo u hoja, contiene uno o más valores. Su estudio corresponde a la teoría de
bases de datos, y en esta terminología, los nodos que "cuelgan" de otros, se denominan hijos
("child nodes"). Cada hoja puede tener un máximo de hijos; es lo que se denomina grado
máximo del árbol ("maximun degree"). Si no tiene ninguno, se dice que es un nodo terminal.

Son especialmente interesantes y útiles los árboles ordenados (denominados B-trees).  Esto
significa que para su construcción, los nodos que se van agregando no se colocan al azar,
colgando de cualquier nodo existente, sino según un criterio que tiene en consideración el
"valor" de la hoja. Este tipo de estructura se usa extensivamente en las bases de datos y en
los sistemas de ficheros .  En los b-trees se distinguen varios parámetros que son
determinantes en cuanto a su idoneidad como estructuras de datos.  El primero es el máximo
número de hijos (y datos) que puede tener cada hoja; es lo que se denomina grado máximo
del árbol ("maximun degree").  El número de hijos de una hoja o nodo, puede variar desde
ninguno (nodos terminales) al máximun degree.  Otro parámetro importante es el número
mínimo de datos que puede contener un nodo, grado mínimo ("minimun degree"). Este valor
es utilizado en los procesos de inserción de nuevos datos, y determina la forma en que se
desdoblan los nodos existentes para acomodar los nuevos valores (el conjunto debe
permanecer ordenado).

Generalmente cada hoja de un árbol es en sí misma una estructura de datos (en el sentido C++
del término .  Uno o varios los campos de esta estructura se utilizan para la ordenación
(campos-índice), y desde luego se exige que exista un criterio de ordenación para los valores
de estos campos. Es decir: que se establezca una regla por la que se pueda determinar de
forma inequívoca si dos valores son iguales, o desiguales, y en este último caso cual precede
en el orden (este orden suele ser numérico o alfabético .

4.4.1  Árboles binarios


Existen varios tipos de árboles, pero con mucho, los más utilizados son los denominados
árboles binarios. Son un caso particular de los B-trees en los que cada nodo puede contener
dos datos y tener dos hijos como máximo.  Comparten la característica de las listas doblemente
enlazadas de que cada elemento tiene dos punteros que señalan a otros dos elementos como
máximo (aunque puede no utilizar ninguno o solo uno); comparten también la facilidad de
inserción de elementos en cualquier posición, y que la información puede mantenerse
ordenada, pero aventajan a las listas en que la ordenación es más fácil, ya que existen
algoritmos muy rápidos para encontrar la posición de un dato y no es necesario modificar los
punteros existentes para insertar un nuevo dato, aunque su eliminación puede resultar más
problemática.

Aunque el caso teóricamente más desfavorable también supone tener que recorrer la totalidad
del árbol, para datos aleatorios el número de pasos necesario tiende a Log 2 n, siendo n el
número de elementos del árbol. Como se verá a continuación, las listas simplemente enlazadas
pueden considerarse casos extremos de árboles binarios (árboles degenerados).

Generalmente, el número de pasos necesario para encontrar un dato en una estructura se


expresa mediante la denominada expresión O mayúscula ("Big O notation" en la literatura
inglesa).  Una expresión como O(n) significa que el número de pasos es una expresión lineal
del número n de elementos de la estructura, mientras que O(log(n)) representa que el número
de pasos es proporcional al logaritmo de n.  Por ejemplo, en una estructura de 1M de nodos, la
búsqueda en una pila o cola puede suponer un millón de pasos, mientras que en un árbol
pueden ser solo 6 (logaritmo de 1.000.000).

Tenga en cuenta que en la práctica, los árboles utilizados no suelen ser binarios, sino que su
grado máximo es mayor que 2.  En estos casos, la Big O notations indica el número de pasos
hasta alcanzar el primer encuentro aproximado. A partir de ahí suele ser necesaria una
búsqueda secuencial sobre un pequeño número de nodos hasta encontrar el elemento
buscado.

En la figura 7 se
muestra un árbol
binario de 6
elementos y la
nomenclatura
utilizada. Como
puede verse,
además de los
datos, cada
elemento tiene
dos enlaces:
derecho Ed, e
izquierdo Ei, que
pueden estar o
no ocupados. Los
nodos terminales
son los que tienen a cero sus dos enlaces (no ocupados).

Por lo general los nodos suelen ser estructuras que además de otros miembros conteniendo
información útil, tiene dos punteros a estructuras, que son utilizados como enlaces a los otros
nodos. Por ejemplo, el diseño C++ de un nodo puede ser el siguiente:
struct Nodo {
  tipoX contenido-de-nodo;
  Nodo* enlace-izquierdo;
  Nodo* enlace-derecho;
};

En el manejo de árboles es muy común el empleo de funciones recursivas; en el capítulo 4 se


muestran algunos ejemplos concretos (Estructuras auto-referenciadas).

4.4.2  Proceso de creación

Hemos dicho que los árboles son estructuras de datos, generalmente ordenadas; aunque
pueden no estarlo, la mayoría de sus aplicaciones requieren que lo estén. Al igual que en las
listas, el criterio de ordenación puede ser cualquiera. Sin embargo, es importante señalar que la
disposición final de los nodos depende del orden de creación. Una vez establecido el criterio de
ordenación que se utilizará, el proceso de construcción es el siguiente:  El primer elemento se
coloca como nodo raíz; a continuación se añade el segundo elemento, que colgará del puntero
derecho Ed (rama derecha) si es mayor que el raíz, y del izquierdo Ei en caso contrario (igual o
menor). A continuación se añade el tercero, que se colocará en la rama izquierda si es mayor
que el raíz y en la derecha si menor o igual. El proceso sigue indefinidamente hasta que se han
colocado todos los elementos del árbol.

En la figura 8 se muestra el aspecto de un árbol de 6


elementos, suponiendo un orden de colocación numérico.
Se han colocado elementos con valores  6, 8, 9, 10, 12 y
14 en el orden de creación siguiente: 10, 8, 9, 12, 6, 14.

Si el orden de
inserción hubiese
sido ligeramente
distinto, por ejemplo:
8, 9, 12, 6, 14, 10, el
aspecto sería el de la
figura 9.

A su vez, en la figura 10 se muestra el aspecto con un tercer


orden de creación, cambiando solo el orden del segundo y
tercer elementos del caso anterior:  8, 12, 9, 6, 14, 10

En la figura 11 se muestra un caso extremo; el aspecto del árbol


con un orden de creación 6, 8, 9, 10, 12 y 14, es decir: cuando los
elementos han sido previamente ordenados.

Como puede observarse, con independencia de cual sea el orden


de creación, ocurre que en cualquier nodo del árbol binario
ordenado, los elementos de la rama inferior derecha (caso de existir) son mayores que el
elemento del nodo, y los de la rama inferior izquierda son menores o iguales (suponiendo
también su existencia).

4.4.3  Equilibrio

Como se ha indicado, la forma de un árbol binario ordenado depende exclusivamente del orden
de introducción de los datos. Cuando el árbol adopta la forma aproximada de la figura 8 se dice
que está equilibrado; por el contrario, el de la figura 9 está desequilibrado.  A su vez, el caso
representado en la figura 11 ha degenerado en una lista simplemente enlazada. Habrá
observado que el árbol más desequilibrado (degenerado) se obtiene precisamente cuando se
suministran los datos ordenados, y que los mejores resultados, en cuanto al equilibrio, se
obtienen con un orden aleatorio.

En realidad la cuestión del equilibrio no es de tipo estético sino práctico. El número de saltos
para para encontrar un dato en un árbol binario depende de su altura (número de niveles), que
es menor cuanto más equilibrado esté. Como se ha señalado, en un árbol de n nodos este
número tiende a Log2 n cuando está perfectamente equilibrado, y a n/2 en caso de que haya
degenerado en una lista simplemente enlazada. Cuando se trata de árboles de cientos o miles
de nodos en los que se repiten cientos o miles de accesos, las diferencias globales pueden ser
muy significativas. Por ejemplo, para encontrar un dato en un árbol de 1.024 elementos los
valores teóricos medios oscilan entre 10 pasos si está equilibrado y 512 si degenera en una
lista. Puede concluirse por tanto, que un árbol equilibrado es una buena estructura de datos
desde la óptica de los mecanismos de acceso a la información.

4.4.4  Recorrido de un árbol binario

Suponiendo un árbol binario ordenado, como el de la


figura 12, existen tres formas estándar de recorrer la
totalidad de sus nodos: inorden, preorden y postorden. 
La diferencia está en el criterio seguido en uno y otro caso
para recorrer las ramas. El primero es el que produciría
una salida ordenada de los valores de sus nodos.

La secuencia de los recorridos en los tres casos serían:

Inorden:       A D E b e g k
Preorden:    b D A E g e k
Postorden:   A E D e k g
b

En el epígrafe dedicado a las Estructuras auto referenciadas se muestran ejemplos de los


algoritmos recursivos utilizados en uno y otro caso

También podría gustarte