Está en la página 1de 32

Capítulo 1.

Árboles binarios.
Una de las numerosas aplicaciones de los árboles binarios son los motores de búsqueda en internet, como es el
caso de Google.

Objetivos del capítulo.


En este capítulo el estudiante:
1. Recordará el significado de árbol binario y los términos relacionados (sección 1.1).
2. Repasará la definición matemática de árbol binario, su nomenclatura y representación (sección 1.2).
3. Estudiará los dos tipos principales de árboles binarios, el completo y el extendido, además de sus expresiones
algebraicas (sección 1.3).
4. Estudiará los tipos de representación de los árboles binarios
en la memoria (sección 1.4).
5. Aprenderá las formas básicas para recorrer los árboles binarios (1.5).
6. Estudiará los árboles binarios de búsqueda y sus algoritmos (sección 1.6).
7. Comprenderá los conceptos de colas prioritarias y montículos (sección 1.7).
8. Aprenderá qué son las longitudes de caminos y el algoritmo de Huffman (sección 1.8).

1.1 Introducción.
El árbol binario es una estructura fundamental en matemáticas y computación y también se le aplican algunos de
los términos de los árboles con raíz como arista, camino, rama, hoja, profundidad y número de nivel. No
obstante, en los árboles binarios se usará el término nodo, en lugar de vértice. Debe tener en cuenta que un árbol
binario no es un caso especial de un árbol con raíz; son entes matemáticos diferentes.

1.2 Árboles binarios.


Un árbol binario T es un conjunto finito de elementos que se denominan nodos, tales que:
1) T es vacío (árbol nulo o árbol vacío), o
2) T contiene un nodo distintivo R, denominado raíz de T, y los nodos restantes de T forman un par ordenado de
árboles binarios ajenos T1 y T2.

Si T contiene una raíz R, entonces los árboles T1 y T2 se denominan, respectivamente, subárbol izquierdo y
subárbol derecho de R. Si T1 no es vacío, entonces su raíz se denomina sucesor izquierdo de R; en forma
semejante, si T2 no es vacío, entonces su raíz se denomina sucesor derecho de R.

La definición anterior de un árbol binario T es recursiva, ya que T se define en términos de los subárboles
binarios T1 y T2. Esto significa, en particular, que cualquier nodo N de T contiene un subárbol izquierdo y un
subárbol derecho, y que cada subárbol o ambos pueden ser vacíos. Así, cualquier nodo N en T tiene 0, 1 o 2
sucesores. Un nodo sin sucesores se denomina nodo terminal. Por tanto, los dos subárboles de un nodo terminal
son vacíos.

Representación de un árbol binario.


Un árbol binario T suele presentarse por medio de un diagrama en el plano, denominado ilustración de T. En
específico, el diagrama de la figura 1.1a representa un árbol binario ya que:
i) T consta de 11 nodos, que se representan con las letras A a L, excepto la I.
ii) La raíz de T es el nodo A en la parte superior del diagrama.
iii) Una línea inclinada hacia la izquierda en un nodo T indica un sucesor izquierdo de N; y una línea inclinada
hacia la derecha en T indica un sucesor derecho de N.
Por consiguiente, en la figura 1.1a:

Nivel 0.
Raíz = A
Nivel 1.
Hijo izquierdo de A = B
Hijo derecho de A = C
Nivel 2.
Hijo izquierdo de B = D
Hijo derecho de B = E
Hijo izquierdo de C = G
Hijo derecho de C = H
Nivel 3.
Hijo izquierdo de D = No hay
Hijo derecho de D = No hay
Hijo izquierdo de E = F
Hijo derecho de E = No hay
Hijo izquierdo de G = No hay
Hijo derecho de G = No hay
Hijo izquierdo de H = J
Hijo derecho de H = K
Nivel 4.
Hijo izquierdo de J = L
Hijo derecho de J = No hay
Hijo izquierdo de K = No hay
Hijo derecho de K = No hay

a) B es un sucesor izquierdo y C es un sucesor derecho de la raíz A.


b) El subárbol izquierdo de la raíz A consta de los nodos B, D, E y F, y el subárbol derecho consta de los nodos
C, G, H, J, K y L.
c) Los nodos A, B, C y H tienen dos sucesores; los nodos E y J tienen sólo un sucesor, y los nodos D, F, G, L y
K no tienen sucesores; es decir, son nodos terminales.

Árboles binarios semejantes.


Se dice que los árboles binarios T y T' son semejantes si tienen la misma estructura o, en otras palabras, si tienen
la misma forma. Se dice que son copias si son semejantes y si tienen el mismo contenido en nodos
correspondientes.

Figura 1.1 a
Nivel 0.
Raíz = A
Nivel 1.
Hijo izquierdo de A = B
Hijo derecho de A = C
Nivel 2.
Hijo izquierdo de B = D
Hijo derecho de B = E
Hijo izquierdo de C = G
Hijo derecho de C = H
Nivel 3.
Hijo izquierdo de D = No hay
Hijo derecho de D = No hay
Hijo izquierdo de E = F
Hijo derecho de E = No hay
Hijo izquierdo de G = No hay
Hijo derecho de G = No hay
Hijo izquierdo de H = J
Hijo derecho de H = K
Nivel 4.
Hijo izquierdo de J = L
Hijo derecho de J = No hay
Hijo izquierdo de K = No hay
Hijo derecho de K = No hay

Figura 1.1. 1
Nivel 0.
Raíz = A
Nivel 1.
Hijo izquierdo de A = No hay
Hijo derecho de A = B
Nivel 2.
Hijo izquierdo de B = C
Hijo derecho de B = D

Figura 1.1. 2
Nivel 0.
Raíz = E
Nivel 1.
Hijo izquierdo de E = F
Hijo derecho de A = No hay
Nivel 2.
Hijo izquierdo de F = G
Hijo derecho de F = H

Figura 1.1. 3
Nivel 0.
Raíz = A
Nivel 1.
Hijo izquierdo de A = No hay
Hijo derecho de A = B
Nivel 2.
Hijo izquierdo de B= C
Hijo derecho de B = D

Figura 1.1. 4
Nivel 0.
Raíz = E
Nivel 1.
Hijo izquierdo de E = No hay
Hijo derecho de E = F
Nivel 2.
Hijo izquierdo de F= G
Hijo derecho de F = H
EJEMPLO 1.1
Considere los cuatro árboles binarios en la figura 1.1b. Los tres árboles 1, 3 y 4 son semejantes. En particular,
los árboles 1 y 3 son copias, puesto que también tienen los mismos datos en los nodos correspondientes. El árbol
2 no es semejante ni copia del árbol 4 porque, en un árbol binario, se distingue entre un sucesor izquierdo y un
sucesor derecho incluso cuando sólo hay un sucesor.

Terminología.
Para describir relaciones entre los nodos de un árbol T a menudo se usa la terminología que describe relaciones
familiares: suponga que N es un nodo en T con sucesor izquierdo S1 y sucesor derecho S2. Entonces N se
denomina padre (o progenitor) de S1 y S2. En forma semejante, S1 se denomina hijo izquierdo (o descendiente
izquierdo) de N, y S2 se denomina hijo derecho (o descendiente derecho) de N. Además, se dice que S1 y S2 son
hermanos (o consanguíneos). Todo nodo N en un árbol binario T, excepto la raíz, tiene un padre único,
denominado predecesor de N.

Los términos descendiente y ancestro tienen su significado de costumbre. Es decir, un nodo L se denomina
descendiente de un nodo N (y N se denomina ancestro de L) si existe una sucesión de hijos de N a L; y se
especifica si L es descendiente izquierdo o derecho de N según si L pertenece al subárbol izquierdo o derecho de
N.

La terminología de la teoría de grafos y de la horticultura también se usa con un árbol binario T. Para mayor
claridad, la línea que se traza desde un nodo N de T hasta un sucesor se denomina arista, y una secuencia de
aristas consecutivas se denomina camino. Un nodo terminal se denomina hoja, y un camino que termina en una
hoja se denomina rama.

A cada nodo en un árbol binario T se le asigna un número de nivel en el orden siguiente: a la raíz R del árbol T
se le asigna el número de nivel 0, y a los demás nodos se les asigna un número de nivel que es 1 más que el
número de nivel de su padre. Además, se dice que los nodos con el mismo número de nivel pertenecen a la
misma generación.

La profundidad (o altura) de un árbol T es el número máximo de nodos en una rama de T. Resulta que ésta es
una unidad mayor que el número de nivel de T. El árbol T en la figura 1.1a tiene profundidad 5.

1.3 Árboles binarios completos y extendidos.


En esta sección se consideran dos tipos especiales de árboles binarios.

Árboles binarios completos.


Considere cualquier árbol binario T. Cada nodo de T puede tener cuando mucho dos hijos. En consecuencia, es
posible demostrar que el nivel r de T puede tener cuando mucho 2^r nodos.

Se dice que el árbol T es completo si todos sus niveles, excepto posiblemente el último, tienen el número
máximo de nodos posibles, y si todos los nodos en el último nivel se encuentran lo más a la izquierda posible.
Por tanto, hay un único árbol completo Tn con exactamente n nodos (donde se ignora el contenido de los nodos).
El árbol completo T26 con 26 nodos se muestra en la figura 1.2.

Figura 1.2 Árbol completo T26.


Nivel 0.
Raíz = 1
Nivel 1.
Hijo izquierdo de 1 = 2
Hijo derecho de 1 = 3
Nivel 2.
Hijo izquierdo de 2 = 4
Hijo derecho de 2 = 5
Hijo izquierdo de 3 = 6
Hijo derecho de 3 = 7
Nivel 3.
Hijo izquierdo de 4 = 8
Hijo derecho de 4 = 9
Hijo izquierdo de 5 = 10
Hijo derecho de 5 = 11
Hijo izquierdo de 6 = 12
Hijo derecho de 6 = 13
Hijo izquierdo de 7 = 14
Hijo derecho de 7 = 15

Nivel 4.
Hijo izquierdo de 8 = 16
Hijo derecho de 8 = 17
Hijo izquierdo de 9 = 18
Hijo derecho de 9 = 19
Hijo izquierdo de 10 = 20
Hijo derecho de 10 = 21
Hijo izquierdo de 11 = 22
Hijo derecho de 11 = 23
Hijo izquierdo de 12 = 24
Hijo derecho de 12 = 25
Hijo izquierdo de 13 = 26
Hijo derecho de 13 = No hay
Hijo izquierdo de 14 = No hay
Hijo derecho de 14 = No hay
Hijo izquierdo de 15 = No hay
Hijo derecho de 15 = No hay

Los nodos del árbol binario completo T26 en la figura 1.2 se han etiquetado a propósito con los enteros 1, 2, ...,
26, de izquierda a derecha, generación por generación. Dicho etiquetado facilita determinar los hijos y los padres
de cualquier nodo K en cualquier árbol completo Tn.

De modo que los hijos izquierdo y derecho del nodo K son 2* K y 2* K + 1, y el padre de K es el nodo [K/2].
Por ejemplo, los hijos del nodo 9 son los nodos 18 y 19, y su padre es el nodo [9/2] = 4. La profundidad dn del
árbol completo Tn con n nodos está dada por
dn = Abre función piso logaritmo de base 2 y argumento n + 1, cierra función piso.
Éste es un número relativamente pequeño. Por ejemplo, si el árbol completo Tn tiene
n =1000000 nodos, entonces su profundidad dn = 21.

Árboles binarios extendidos: 2-árboles.


Se dice que un árbol binario T es un 2-árbol o un árbol binario extendido si cada nodo N tiene 0 o 2 hijos. En tal
caso, los nodos con dos hijos se denominan nodos internos, y los nodos con 0 hijos se denominan nodos
externos. Algunas veces los nodos se distinguen en diagramas por medio de círculos para los nodos internos y
cuadrados para los nodos externos.
La expresión “árbol binario extendido” proviene de la siguiente operación. Considere un árbol binario T, como
el árbol en la figura 1.3a. Entonces, T puede “convertirse” en un
2-árbol al sustituir cada subárbol vacío por un nuevo nodo, como se muestra en la figura 1.3b.

Observe que el nuevo árbol es, en efecto, un 2-árbol. Además, los nodos en el árbol original T ahora son los
nodos internos en el árbol extendido, y los nuevos nodos son los nodos externos en el árbol extendido. Se
observa que si un 2-árbol tiene n nodos internos, entonces tiene n + 1 nodos externos.

Figura 1.3
Conversión de un árbol binario T en un 2-árbol.
a) Árbol binario T.
b) 2-arbol extendido.

Expresiones algebraicas y notación polaca.


Sea E cualquier expresión algebraica en la que sólo se usan operaciones binarias, como
E = (a-b) / ((c*d) + e)
Entonces E puede representarse por medio de un 2-árbol como en la figura 1.4a, donde las variables en E
aparecen como los nodos externos y las operaciones en E aparecen como nodos internos.

El matemático polaco Lukasiewics observó que, al escribir el símbolo para operaciones binarias antes de sus
argumentos, por ejemplo,
+ab en lugar de a + b y /cd en lugar de c/d
Note no es necesario usar ningún paréntesis. Esta notación se denomina notación polaca en forma de prefijo. (De
manera semejante, el símbolo puede escribirse después de sus argumentos, lo que se denomina notación polaca
en notación de posfijo.) Cuando E vuelve a escribirse en forma de prefijo se obtiene:
E=/-ab+*cde

Observe que éste es precisamente el orden lexicográfico de los vértices en su 2-árbol que se obtiene al examinar
el árbol como en la figura 1.4b.
Figura 1.4
Nivel 0.
Raíz = /
Nivel 1.
Hijo izquierdo de / = -
Hijo derecho de / = +
Nivel 2.
Hijo izquierdo de - = a
Hijo derecho de - = b
Hijo izquierdo de + = *
Hijo derecho de + = e
Nivel 3.
Hijo izquierdo de a = No hay
Hijo derecho de a = No hay
Hijo izquierdo de b = No hay
Hijo derecho de b = No hay
Hijo izquierdo de * = c
Hijo derecho de * = d
Hijo izquierdo de e = No hay
Hijo derecho de e = No hay

Note que el recorrido que realiza es:


Raíz /
hijo izquierdo de / = -
hijo izquierdo de - = a
hijo derecho de - = b
finaliza recorrido por la izquierda, luego:
hijo derecho de raíz / = +
hijo izquierdo de + = *
hijo izquierdo de * = c
hijo derecho de * = d
hijo derecho de + = e
Fin.

1.4 Representación de árboles binarios en la memoria.


Sea T un árbol binario. En esta sección se analizan dos formas de representar T en la memoria. La primera
forma, que es la de costumbre, se denomina representación ligada de T y es semejante a la forma en que las listas
ligadas se representan en la memoria. La segunda forma, en la que se usa un solo arreglo, se denomina
representación secuencial de T. El requisito principal de cualquier representación de T es tener acceso directo a
la raíz R de T y, dado cualquier nodo N de T, debe tenerse acceso directo a los hijos de N.

Representación ligada de árboles binarios.


Considere un árbol binario T. A menos que se establezca o implique otra cosa, T se mantiene en la memoria por
medio de una representación ligada en la que se usan tres arreglos paralelos, INFO, LEFT y RIGHT, así como un
apuntador variable ROOT como sigue. En primer lugar, cada nodo N de T corresponde a una ubicación K tal
que:
1) INFO[K] contiene los datos en el nodo N.
2) LEFT[K] contiene la ubicación del hijo izquierdo del nodo N.
3) RIGHT[K] contiene la ubicación del hijo derecho del nodo N.
Además, ROOT contiene la ubicación de la raíz R de T. Si cualquier subárbol es vacío, entonces el apuntador
correspondiente contiene el valor nulo; si el árbol T mismo es vacío, entonces ROOT contiene el valor nulo.

Observación.
En la mayor parte de los ejemplos presentados se muestra un solo dato de información en cada nodo N de un
árbol binario T. En la práctica real un registro entero puede almacenarse en el nodo N. En otras palabras, INFO
puede realmente ser un arreglo lineal de registros o una colección de arreglos paralelos.

Observación.
Para el apuntador nulo denotado por NULL puede escogerse cualquier dirección inválida. En la práctica real,
para NULL se usa 0 o un número negativo.

EJEMPLO 1.2
Considere el árbol binario en la figura 1.1a. La representación ligada de T aparece en la figura 1.5, donde por
conveniencia en la notación los arreglos lineales se han escrito en forma vertical en lugar de horizontal. Observe
que ROOT = 5 apunta a INFO[5] = A puesto que A es la raíz de T, también que LEFT[5] = 10 apunta a
INFO[10] = B puesto que B es el hijo izquierdo de A, y que RIGHT[5] = 2 apunta a INFO[2] = C puesto que C
es el hijo derecho de A. Y así en lo sucesivo. La elección de 18 elementos para el arreglo es arbitraria.

Tabla. Figura 1.5


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
INFO K C G A H L B F E J D
LEFT 0 3 0 10 16 0 17 0 12 7 0
RIGHT 0 6 0 2 1 0 13 0 0 0 0

ROOT 5: 2
Representación secuencial de árboles binarios.
Suponga que T es un árbol binario que es completo o casi completo. Entonces hay una forma eficiente de
mantener T en la memoria, denominada representación secuencial de T. Esta representación usa sólo un arreglo
lineal TREE junto con un apuntador variable END como sigue:
1) La raíz R de T se almacena en TREE [1].
2) Si un nodo N ocupa TREE [K], entonces su hijo izquierdo se almacena en TREE [2* K] y su hijo derecho se
almacena en TREE [2* K + 1].
3) END contiene la ubicación del último nodo de T.

Figura 1.6 a.
Nivel 0.
Raíz = 45
Nivel 1.
Hijo izquierdo de 45 = 22
Hijo derecho de 45 = 77
Nivel 2.
Hijo izquierdo de 22 = 11
Hijo derecho de 22 = 30
Hijo izquierdo de 77 = No hay
Hijo derecho de 77 = 90
Nivel 3.
Hijo izquierdo de 11 = No hay
Hijo derecho de 11 = 15
Hijo izquierdo de 30 = 25
Hijo derecho de 30 = No hay
Hijo izquierdo de 77 = No hay
Hijo derecho de 77 = No hay
Hijo izquierdo de 90 = 88
Hijo derecho de 90 = No hay

Figura 1.6 b.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 … 40
TREE 4 22 77 1 30 9 1 25 88
5 1 0 5

END 14: 88

Además, el nodo N en TREE[K] contiene un subárbol izquierdo vacío o un subárbol derecho vacío según si 2* K
o 2* K + 1 excede END o según si TREE [2* K] o TREE [2* K + 1] contiene el valor NULL.
La representación secuencial del árbol binario T en la figura 1.6a aparece en la figura 1.6b. Observe que se
requieren 14 ubicaciones en el arreglo TREE aun cuando T sólo tiene 9 nodos. En términos generales, la
representación secuencial de un árbol con profundidad d requiere un arreglo con aproximadamente 2^d
elementos. En consecuencia, esta representación secuencial suele ser ineficiente, a menos que, como ya se
afirmó, el árbol binario T sea completo o casi completo. Por ejemplo, el árbol T en la figura 1.1a tiene 11 nodos
y profundidad 5, es decir que requiere un arreglo con aproximadamente 2^5 = 32 elementos.

1.5 Recorrido de árboles binarios.


Hay tres formas normales para recorrer un árbol binario T con raíz R. Estos tres algoritmos, que se denominan
preorden, inorden y postorden, tienen la función de:
Preorden:
1) Procesa la raíz R.
2) Recorre el subárbol izquierdo de R en preorden.
3) Recorre el subárbol derecho de R en preorden.

Inorden:
1) Recorre el subárbol izquierdo de R en inorden.
2) Procesa la raíz R.
3) Recorre el subárbol derecho de R en inorden.

Postorden:
1) Recorre el subárbol izquierdo de R en postorden.
2) Recorre el subárbol derecho de R en postorden.
3) Procesa la raíz R.

Observe que cada algoritmo consta de los mismos tres pasos y que el subárbol izquierdo de R siempre se recorre
antes que el subárbol derecho. La diferencia entre los algoritmos es el momento en que se procesa la raíz.
Específicamente, en el algoritmo “pre” la raíz R se procesa antes de que se recorran los subárboles; en el
algoritmo “in”, la raíz R se procesa entre el recorrido de los subárboles; en el algoritmo “post”, la raíz R se
procesa después que se recorren los subárboles.
Algunas veces los tres algoritmos se denominan, respectivamente, recorrido del nodo-izquierdo-derecho (NLR:
node-left-right), recorrido del izquierdo-nodo-derecho (left-node-right, LNR), y recorrido izquierdo-derecho-
nodo (LRN: left-right-node).

EJEMPLO 1.3
Considere el árbol binario T en la figura 1.7a. Observe que A es la raíz de T, que el subárbol izquierdo LT de T
consta de los nodos B, D y E, y el subárbol derecho RT de T consta de los nodos C y F.

a) El recorrido en preorden de T procesa A, recorre LT y recorre RT. Sin embargo, el recorrido en preorden de
LT procesa la raíz B y luego D y E; y el recorrido en preorden de RT procesa la raíz C y luego F. Así, ABDECF
es el recorrido en preorden de T.

b) El recorrido en inorden de T recorre LT, procesa A y recorre RT. Sin embargo, el recorrido en inorden de LT
procesa D, B y luego E; y el recorrido inorden de RT procesa C y luego F. Así, DBEACF es el recorrido en
inorden de T.

c) El recorrido en postorden de T recorre LT, recorre RT y procesa A. Sin embargo, el recorrido en postorden de
LT procesa D, E y luego B, y el recorrido en postorden de RT procesa F y luego C. En consecuencia, DEBFCA
es el recorrido en postorden de T.

Figura 1.7 a

Figura 1.7 b

EJEMPLO 1.4
Sea T el árbol binario en la figura 1.7b. El recorrido en preorden es como sigue:
(Preorden) A B D E F C G H J L K
Este orden es el mismo que resulta al analizar el árbol desde la izquierda como se indica con el camino en la
figura 1.7b. Es decir, se hace un “desplazamiento” por la rama más a la izquierda hasta que se encuentra un nodo
terminal; luego se retrocede hacia la rama siguiente y así sucesivamente. En el recorrido en preorden, el nodo
terminal más a la derecha, el nodo K, es el último nodo que se analiza. Observe que el subárbol izquierdo de la
raíz A se recorre antes que el subárbol derecho; y que ambos se recorren después de A.

Lo mismo es cierto para cualquier otro nodo que tenga subárboles, que es la propiedad subyacente de un
recorrido en preorden.
El lector puede comprobar por inspección que las otras dos formas de recorrer el árbol T en la figura 1.7b son
como sigue:
(Inorden) D B F E A G C L J H K
(Postorden) D F E B G L J K H C A

Observación.
Los nodos terminales D, F, G, L y K del árbol binario en la figura 1.7b se recorren en el mismo orden, de
izquierda a derecha, en los tres recorridos, lo que es verdad para cualquier árbol binario T.

1.6 Árboles binarios de búsqueda.


En esta sección se analiza una de las estructuras de datos más importantes en computación: un árbol binario de
búsqueda. Dicha estructura permite buscar y encontrar un elemento con un tiempo medio de ejecución f (n) =
O(log2n), donde n es el número de datos. También permite insertar y eliminar elementos fácilmente. Esta
estructura contrasta con las siguientes estructuras:

a) Arreglo lineal ordenado: permite buscar y encontrar un elemento con tiempo de ejecución
f (n) = O(logaritmo de base 2 y argumento n). Sin embargo, insertar y eliminar elementos es costoso puesto que,
en promedio, implica el movimiento de O(n) elementos.

b) Lista ligada: permite insertar y eliminar elementos fácilmente. No obstante, resulta costoso buscar y encontrar
un elemento, ya que es necesario usar una búsqueda lineal con tiempo de ejecución f (n) = O(n).

Aunque cada nodo en un árbol binario de búsqueda puede contener un registro completo de datos, la definición
del árbol depende de un campo dado cuyos valores son distintos y pueden ordenarse.

Definición.
Suponga que T es un árbol binario. Entonces T se denomina árbol binario de búsqueda si cada nodo N de T tiene
la siguiente propiedad:

El valor de N es mayor que cualquier valor en el subárbol izquierdo de N y es menor que cualquier valor en el
subárbol derecho de N.
No es difícil ver que la propiedad enunciada garantiza que el recorrido en inorden de T produce un listado
ordenado de los elementos de T.

Observación.
La definición anterior de un árbol binario de búsqueda supone que todos los valores de los nodos son distintos.
Hay una definición semejante de un árbol binario de búsqueda T que admite duplicados; es decir, donde cada
nodo N tiene las siguientes propiedades:

a) N > M para cualquier nodo M en un subárbol izquierdo de N.


b) N< M para cualquier nodo M en un subárbol derecho de N.

La aplicación de esta definición modifica las operaciones siguientes, según el caso.


EJEMPLO 1.5
El árbol binario T en la figura 1.8a es un árbol binario de búsqueda. Es decir, todo nodo N en T excede a todo
número en su subárbol izquierdo y es menor que cualquier número en su subárbol derecho. Suponga que el 23 se
sustituye por 35 y T aún es un árbol binario de búsqueda. Por otra parte, suponga que el 23 se sustituye por 40.
Entonces T no sería un árbol binario de búsqueda, puesto que 40 estaría en el subárbol izquierdo de 38 pero 40 >
38.

Figura 1.8 a
Figura 1.8 b
Figura 1.8 c

Búsqueda e inserción en un árbol binario de búsqueda.


En la figura 1.9 se muestra un algoritmo de búsqueda e inserción en un árbol binario de búsqueda T.

Algoritmo 1.1
Se proporcionan un árbol binario de búsqueda T y un ITEM de información. El algoritmo encuentra la ubicación
de ITEM en T, o inserta ITEM como un nuevo nodo en el árbol.
Paso 1.
ITEM se compara con la raíz N del árbol.
a) Si ITEM < N se procede al hijo izquierdo de N.
b) Si ITEM > N se procede al hijo derecho de N.
Paso 2.
Se repite el paso 1 hasta que ocurre una de las siguientes situaciones:
a) Se encuentra un nodo N tal que ITEM = N. En este caso, la búsqueda ha sido exitosa.
b) Se encuentra un subárbol vacío, indicación de que la búsqueda ha sido infructuosa. ITEM se inserta en lugar
del subárbol vacío.
Paso 3.
Salir.

EJEMPLO 1.6
Considere el árbol binario de búsqueda T en la figura 1.8a. Suponga que se proporciona ITEM = 20, y que se
desea encontrar o insertar ITEM en T. Al simular el algoritmo 1.1 se obtienen los pasos siguientes:
1) ITEM = 20 se compara con la raíz R = 38.
Puesto que 20 < 38, se procede al hijo izquierdo de 38, que es 14.
2) ITEM = 20 se compara con 14.
Puesto que 20 > 14, se procede al hijo derecho de 14, que es 23.
3) ITEM = 20 se compara con 23.
Puesto que 20 < 23, se procede al hijo izquierdo de 23, que es 18.
4) ITEM = 20 se compara con 18.
Puesto que 20 > 18 y 18 no tiene hijo derecho, 20 se inserta como el hijo derecho de 18.

En la figura 1.11b se muestra el nuevo árbol con ITEM = 20 insertado. Se destaca el camino bajo el árbol
durante el algoritmo.

Eliminación en un árbol binario de búsqueda.


En la figura 1.10 se muestra un algoritmo que elimina un ITEM dado de un árbol binario de búsqueda T. Se usa
el algoritmo 1.1 en la figura 1.9 para encontrar la ubicación de ITEM en T.
Observación.
El caso iii) en el paso 2c) es más complicado que en los dos primeros casos. El sucesor inorden S(N) de N se
encuentra como sigue. A partir del nodo N se realiza un desplazamiento a la derecha hacia al hijo derecho de N y
luego se hacen desplazamientos sucesivos hacia la izquierda hasta que se encuentra un nodo M sin hijo
izquierdo. El nodo M es el sucesor inorden S(N) de N.
A Algoritmo 1.2

Se proporcionan un árbol binario de búsqueda T y un ITEM de información. P(N ) denota el padre de un nodo N,
y S(N) denota el sucesor inorden de N. El algoritmo elimina ITEM de T.
Paso 1.
El algoritmo 1.1 se usa para encontrar la ubicación del nodo N que contiene a ITEM y mantiene el rastro de la
ubicación del nodo padre P(N ). (Si ITEM no está en T, entonces STOP y salir.)
Paso 2.
Se determina el número de hijos de N. Hay tres casos: a) N no tiene hijos. N se elimina de T al sustituir
simplemente la ubicación de N en el nodo padre P(N ) por el apuntador NULL. b) N tiene exactamente un hijo
M. N se elimina de T al sustituir la ubicación de N en el nodo padre P(N) por la ubicación de M. (Esto sustituye
N por M.) c) N tiene dos hijos.
i) Se encuentra el sucesor inorden S(N ) de N. (Entonces S(N ) no tiene hijo izquierdo.)
ii) S(N ) se elimina de T usando a) o b).
iii) N se sustituye por S(N ) en T.
Paso 3.
Salir.

EJEMPLO 1.7
Considere el árbol binario T en la figura 1.8b. Suponga que se desea eliminar ITEM = 14 de T. Primero se
encuentra el nodo N tal que N = 14. Observe que N = 14 tiene dos hijos. Al realizar un movimiento hacia la
derecha y luego a la izquierda, se encuentra el sucesor inorden S(N) = 18 de N. S(N) = 18 se elimina al
sustituirlo por su hijo único 20, y luego N = 14 se sustituye por S(N) = 18. Así se obtiene el árbol en la figura
1.8c.

Complejidad de los algoritmos de los árboles binarios de búsqueda.


Sea T un árbol binario con n nodos y profundidad d, y sea f (n) que denota el tiempo de ejecución de cualquiera
de los algoritmos anteriores. El algoritmo 1.1 indica proceder a partir de la raíz R y recorrer el árbol T hasta
encontrar ITEM en T o insertar ITEM como un nodo terminal. El algoritmo 1.2 indica proceder a partir de la raíz
R y recorrer el árbol T para encontrar ITEM y luego continuar el recorrido por el árbol para encontrar el sucesor
inorden de ITEM. En cualquier caso, el número de movimientos no puede exceder la profundidad d del árbol.
Por tanto, el tiempo de ejecución f (n) de cualquier algoritmo depende de la profundidad d del árbol T.
Ahora suponga que T tiene la propiedad de que, para cualquier nodo N de T, las profundidades de los subárboles
de N difieren cuando mucho por 1. Entonces se dice que el árbol T está balanceado y d es aproximadamente
igual a logaritmo en base 2 y argumento n. En consecuencia, el tiempo de ejecución f (n) de cualquier algoritmo
en un árbol balanceado es muy rápido; específicamente, f (n) = O(logaritmo de base 2 y argumento n). Por otra
parte, a medida que se agregan datos en un árbol binario de búsqueda T, no hay garantía de que T permanezca
balanceado. Incluso puede ocurrir que d ~ n. En este caso, f (n) puede ser relativamente lento; específicamente, f
(n) = O(n). Por fortuna, hay técnicas para volver a balancear un árbol binario de búsqueda T a medida que se le
agregan elementos. Sin embargo, tales técnicas rebasan el alcance de este texto.

1.7 Colas prioritarias, montículos.


Sea S una cola de prioridad. Es decir, S es un conjunto donde es posible insertar o eliminar elementos
periódicamente, pero donde siempre se elimina el mayor elemento actual (el elemento con prioridad más alta).
Para mantener a S en la memoria hay que hacer un:
a) Arreglo lineal: aquí resulta fácil insertar un elemento al agregarlo simplemente al final del arreglo. Sin
embargo, resulta costoso buscar y encontrar el elemento más grande, ya que es necesario usar una búsqueda
lineal con tiempo de ejecución f (n) = O(n).
b) Arreglo lineal ordenado: aquí el elemento más grande es el primero o el último, de modo que es fácil
eliminarlo. No obstante, insertar y eliminar elementos resulta costoso porque, en promedio, implica mover O(n)
elementos.

En esta sección se presenta una estructura discreta que puede implementar en forma eficiente una cola de
prioridad S.

Montículos.
Suponga que H es un árbol binario completo con n elementos. Se supone que H se mantiene en la memoria
mediante su representación secuencial, no una representación ligada. (Vea la sección 1.4.)

Definición 1.1
Suponga que H es un árbol binario completo. Entonces H se denomina montículo (heap) o máxheap, si cada
nodo N tiene la siguiente propiedad.
El valor de N es mayor que o igual al valor de cada uno de los hijos de N.
Por consiguiente, en un montículo, el valor de N excede el valor de cada uno de sus descendientes. En particular,
la raíz de H es un valor más grande de H.
Un mínheap se define en forma semejante: el valor de N es menor que o igual al valor de cada uno de sus hijos.

EJEMPLO 1.8
Considere el árbol binario completo H en la figura 1.11a. Observe que H es un montículo. Esto significa, en este
caso, que el elemento más grande de H aparece en la “parte superior” del montículo. En la figura 1.11b se
muestra la representación secuencial de H mediante el arreglo TREE y la variable END. En consecuencia:
a) TREE [1] es la raíz R de H.
b) TREE[2*K] y TREE [2*K + 1] son los hijos izquierdo y derecho de TREE[K].
c) La variable END = 20 apunta al último elemento en H.
d) El padre de cualquier nodo TREE(J) distinto de la raíz es el nodo TREE [J /2] (donde J/ 2 significa división
entera).

Observe que los nodos de H en el mismo nivel aparecen uno después del otro en el arreglo TREE. La elección de
30 ubicaciones para TREE es arbitraria.

a) Montículo.
Nivel 0.
Raíz = 97
Nivel 1.
Hijo izquierdo de 97 = 88
Hijo derecho de 97 = 95
Nivel 2.
Hijo izquierdo de 88 = 66
Hijo derecho de 88 = 55
Hijo izquierdo de 95 = 95
Hijo derecho de 95 = 48
Nivel 3.
Hijo izquierdo de 66 = 66
Hijo derecho de 66 = 35
Hijo izquierdo de 55 = 48
Hijo derecho de 55 = 55
Hijo izquierdo de 95 = 62
Hijo derecho de 95 = 77
Hijo izquierdo de 48 = 25
Hijo derecho de 48 = 38
Nivel 4.
Hijo izquierdo de 66 = 18
Hijo derecho de 66 = 40
Hijo izquierdo de 35= 30
Hijo derecho de 35 = 26
Hijo izquierdo de 48 = 24
Hijo derecho de 48 = No hay
Hijo izquierdo de 55 = No hay
Hijo derecho de 55 = No hay

b) Representación secuencial

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 … 30
TREE 97 88 9 66 55 9 48 66 3 48 55 62 77 25 38 18 40 30 26 24 …
5 5 5

END 20: 24

Inserción en un montículo.
En la figura 1. 12 se proporciona un algoritmo que inserta un ITEM de datos dado en un montículo H.

Observación.
Es necesario comprobar que el algoritmo 1.3 produce un montículo como el árbol final. No es difícil ver esto y
la verificación se deja al lector.

EJEMPLO 1. 9
Considere el montículo H en la figura 1.11. Suponga que se desea insertar ITEM = 70 en H. Al simular el
algoritmo 1.3, primero se adjunta ITEM como el último elemento del árbol completo; es decir, como el hijo
derecho de 48.

Algoritmo 1.3.
Se proporcionan un montículo H y un nuevo ITEM. El algoritmo inserta ITEM en H.
Paso 1.
ITEM se adjunta al final de H, de modo que H aún es un árbol completo, pero no necesariamente un montículo.
Paso 2.
(Reheap) Se deja que ITEM suba a su “sitio apropiado” en H, de modo que H es un montículo. Es decir:
a) ITEM se compara con su padre P(ITEM). Si ITEM > P(ITEM), entonces se intercambian ITEM y P(ITEM).
b) Se repite a) hasta que ITEM <= P(ITEM).
Paso 3.
Salir

En otras palabras, se hace TREE [21] = 70 y END = 21. Luego se aplica la operación reheap; es decir, se deja
que ITEM suba a su sitio apropiado como sigue:
a) ITEM = 70 se compara con su padre 48.
Puesto que 70 > 48, se intercambian 70 y 48.
b) ITEM = 70 se compara con su nuevo padre 55.
Puesto que 70 > 55, se intercambian 70 y 55.
c) ITEM = 70 se compara con su padre 88.
Puesto que 70 < 88, ITEM = 70 ha subido a su sitio apropiado en el montículo H.
En la figura 1.13 se muestra el árbol final H con la inserción de ITEM = 70. En el árbol se destaca el camino
hecho por ITEM.

Eliminación de la raíz de un montículo.


En la figura 1.14 se proporciona un algoritmo que elimina la raíz R de un montículo H.

Observación.
Tal como ocurre en la inserción en un montículo es necesario comprobar que el algoritmo 1.4 siempre produce
un montículo como árbol final. De nuevo, esta verificación se deja al lector. Se le recuerda que el paso 3 termina
hasta que el nodo L llega a la parte inferior del árbol; es decir, hasta que L no tiene hijos.

Figura 1.13
ITEM = 70 se ha insertado

Nivel 0.
Raíz = 97
Nivel 1.
Hijo izquierdo de 97 = 88
Hijo derecho de 97 = 95
Nivel 2.
Hijo izquierdo de 88 = 66
Hijo derecho de 88 = 70
Hijo izquierdo de 95 = 95
Hijo derecho de 95 = 48
Nivel 3.
Hijo izquierdo de 66 = 66
Hijo derecho de 66 = 35
Hijo izquierdo de 70 = 55
Hijo derecho de 70 = 55
Hijo izquierdo de 95 = 62
Hijo derecho de 95 = 77
Hijo izquierdo de 48 = 25
Hijo derecho de 48 = 38
Nivel 4.
Hijo izquierdo de 66 = 18
Hijo derecho de 66 = 40
Hijo izquierdo de 35= 30
Hijo derecho de 35 = 26
Hijo izquierdo de 55 = 24
Hijo derecho de 55 = 48
Hijo izquierdo de 55 = No hay
Hijo derecho de 55 = No hay
Algoritmo 1.4
El algoritmo elimina la raíz R de un montículo H dado.
Paso 1.
La raíz R se asigna a algún ITEM variable.
Paso 2.
La raíz eliminada R se sustituye por el último nodo de L de H, de modo que H aún es un árbol binario completo,
aunque no necesariamente un montículo.
[Es decir, se hace TREE [1]: = TREE[END] y luego se hace END: = END - 1.]
Paso 3.
(Reheap) Se hace que L asuma su “sitio apropiado” en H de modo que H es un montículo. Es decir:
a) Se encuentra el mayor hijo LARGE(L) de L. Si L < LARGE(L), entonces se intercambian L y LARGE(L).
b) Se repite a) hasta que L >= LARGE(L).
Paso 4.
Salir.

EJEMPLO 1.10
Considere el montículo H en la figura 1.15a, donde R = 95 es la raíz y L = 22 es el último nodo de H. Suponga
que quiere eliminar R = 95 del montículo H. Al simular el algoritmo 1.4, primero se “elimina” R = 95 al asignar
ITEM = 95, y luego se sustituye R = 95 por L = 22. Así se obtiene el árbol completo en la figura 1-15b) que no
es un montículo. (Observe que ambos subárboles de 22 aún son montículos.) Luego se efectúa una operación
reheap; es decir, se deja que L = 22 asuma su sitio apropiado como sigue:

a) Los hijos de L = 22 son 85 y 70. El mayor es 85. Puesto que 22 < 85, se intercambian 22 y 85. Así se obtiene
el árbol en la figura 1.15c.
b) Ahora los hijos de L = 22 son 33 y 55. El mayor es 55. Puesto que 22 < 55, se intercambian 22 y 55. Así se
obtiene el árbol en la figura 1.15d.
c) Ahora los hijos de L = 22 son 15 y 11. El mayor es 55. Puesto que 22 > 15, el nodo L = 22 ha asumido su sitio
apropiado en el montículo.

Así, la figura 1.15d es el montículo requerido H sin su raíz original R = 95. Observe que se han encerrado los
caminos a medida que L = 22 recorre el árbol.

Complejidad de los algoritmos de montículos.


Sea H un montículo con n nodos. Puesto que H es un árbol completo, d es aproximadamente igual a logaritmo de
base 2 y argumento n, donde d es la profundidad de H. El algoritmo 1.3 indica dejar que el nuevo ITEM recorra
el árbol, de nivel en nivel, hasta que encuentre su sitio apropiado en H. El algoritmo 1.4 indica dejar que el
último nodo original L recorra el árbol, de nivel en nivel, hasta que encuentre su sitio apropiado en H. En
cualquier caso, el número de movimientos no puede exceder la profundidad d de H. Así, el tiempo de ejecución f
(n) de cualquier algoritmo es muy rápido; específicamente, f (n) = O(logaritmo de base 2 y argumento n). En
consecuencia, el montículo constituye una forma mucho más eficiente de implementar una cola de prioridad S
que el arreglo lineal o el arreglo lineal ordenado mencionado al principio de la sección.

Figura 1.15 a
Figura 1.15 b
Figura 1.15 c
1.8 Longitudes de caminos, algoritmo de Huffman.
Sea T un árbol binario extendido o un 2-árbol (sección 1.3). Recuerde que, si T tiene n nodos externos, entonces
T tiene n - 1 nodos internos. En la figura 1.3b se muestra un 2-árbol con siete nodos externos y entonces 7 - 1 = 6
nodos internos.

Longitudes de caminos ponderados.


Suponga que T es un 2-árbol con n nodos externos, y que a cada nodo externo se asigna un peso (no negativo).
La longitud del camino ponderado (o simplemente la longitud del camino) P del árbol T se define como la suma
P = W1*L1 + W2*L2 + … + Wn*Ln
Donde W1 es el peso en un nodo externo Ni y Li es la longitud del camino desde la raíz R hasta el nodo Li. (La
longitud del camino existe inclusive para 2-árboles no ponderados, donde simplemente se supone el peso 1 en
cada nodo externo.)

EJEMPLO 1.11
En la figura 1.16 se muestran tres árboles binarios, T1, T2, T3, donde cada uno tiene nodos externos con los
mismos pesos 2, 3, 5 y 11. Las longitudes de caminos ponderados de los tres árboles son:

Figura 1.16 a
Nivel 0.
Raíz = x
Nivel 1.
Hijo izquierdo de x = y
Hijo derecho de x = z
Nivel 2.
Hijo izquierdo de y = 2 (hoja)
Hijo derecho de y = 3 (hoja)
Hijo izquierdo de z = 5 (hoja)
Hijo derecho de z = 11 (hoja)

P1 = 2*2 + 3*2 + 5*2 + 11*2 = 42

Figura 1.16 b
Nivel 0.
Raíz = x
Nivel 1.
Hijo izquierdo de x = y
Hijo derecho de x = 2 (hoja)
Nivel 2.
Hijo izquierdo de y = 11 (hoja)
Hijo derecho de y = z
Nivel 3.
Hijo izquierdo de z = 3 (hoja)
Hijo derecho de z = 5 (hoja)

P2 = 2*1 + 3*3 + 5*3 + 11*2 = 48


Figura 1.16 c
Nivel 0.
Raíz = x
Nivel 1.
Hijo izquierdo de x = y
Hijo derecho de x = 11 (hoja)
Nivel 2.
Hijo izquierdo de y = 5 (hoja)
Hijo derecho de y = z
Nivel 3.
Hijo izquierdo de z = 2 (hoja)
Hijo derecho de z = 3 (hoja)

P3 = 2*3 + 3*3 + 5*2 + 11*1 = 36


Las cantidades P1 y P3 indican que el árbol completo no necesariamente proporciona un camino mínimo, y que
las cantidades P2 y P3 indican que árboles semejantes no necesariamente proporcionan la misma longitud del
camino.

Algoritmo de Huffman.
El problema general que se quiere resolver es el siguiente. Suponga que se proporciona una lista de n pesos:
W1, W2, …, Wn.

De entre todos los árboles binarios con n nodos externos y con los n pesos dados, se debe encontrar un árbol con
longitud del camino ponderado mínimo. (Un árbol así rara vez es único.) Huffman proporcionó un algoritmo
para encontrar un árbol T así.
El algoritmo de Huffman, que se muestra en la figura 1.17, se define recursivamente en términos del número n
de pesos. En la práctica se usa una forma iterada equivalente del algoritmo de Huffman que construye el árbol T
buscado a partir de la parte inferior, en lugar de hacerlo desde la parte superior.

Algoritmo 1.5 (de Huffman):


El algoritmo encuentra recursivamente un árbol binario ponderado T con n pesos dados w1, w2, …, wn que tiene
una longitud del camino ponderado mínimo.
Paso 1.
Suponga n = 1. Sea T el árbol con un nodo N con peso w1, y luego Salir.
Paso 2.
Suponga n > 1.
a) Se encuentran dos pesos mínimos, por ejemplo, wi y wj, de entre los n pesos dados.
b) wi y wj se sustituyen en la lista por wi + Wj, de modo que la lista tenga n - 1 pesos.
c) Se encuentra un árbol T' que proporcione una longitud del camino ponderado mínimo para los n - 1 pesos.
d) En el árbol T' se sustituye el nodo externo: wi + wj por el subárbol:
Figura 1.17
Nivel 0.
Raíz = x
Nivel 1.
Hijo izquierdo de x = wi (hoja)
Hijo derecho de x = wj (hoja)
e) Salir.
EJEMPLO 1.12
Sean A, B, C, D, E, F, G, H ocho datos con los siguientes pesos asignados:
Tabla:

dato A B C D E F G H
Peso 22 5 11 19 2 11 25 5

Construir un árbol binario T con una longitud del camino ponderado mínimo P que tenga los datos anteriores
como nodos externos.
Se aplica el algoritmo de Huffman. Es decir, los dos subárboles con pesos mínimos se combinan repetidamente
en un solo árbol como se muestra en la figura 1.18a. Por razones de claridad los pesos originales se han
subrayado y un número en un círculo indica la raíz de un nuevo subárbol. El árbol T se traza a partir del paso 8
hacia atrás, con lo que se obtiene la figura 1.18b. (Cuando un nodo se separa en dos partes, el menor se indica a
la izquierda.)

A continuación, se proporciona la longitud del camino P:


P = 22*2 + 11*3 + 11*3 + 25*2 + 5*4 + 2*5 + 5*5 + 19*3 = 280

Implementación en computadora del algoritmo de Huffman.


Considere de nuevo los datos en el ejemplo 1.12. Suponga que se desea implementar el algoritmo con la
computadora. Puesto que algunos de los nodos en el árbol binario están ponderados, el árbol puede mantenerse
por medio de cuatro arreglos paralelos: INFO, WT, LEFT y RIGHT. En las ocho primeras columnas de la figura
1.19 se muestra la forma en que los datos pueden almacenarse inicialmente en la computadora.
Cada paso del algoritmo de Huffman asigna valores a WT, LEFT y RIGHT en las columnas de la 9 a la 15, que
corresponden, respectivamente, a los pasos del 2 al 8 en la figura 1.18: cada paso encuentra los dos pesos
mínimos actuales y sus ubicaciones, y luego introduce la suma en WT y sus ubicaciones en LEFT y RIGHT. Por
ejemplo, los pesos mínimos actuales después de asignar valores a la columna 11, que corresponde al paso 4, son
12 y 19, que aparecen en WT [10] y WT [4]. Por consiguiente, se asigna WT [12] = 12 + 19 = 31 y LEFT [12] =
10 y RIGHT [12] = 4. El último paso indica que ROOT = 15, o se usa el hecho de que ROOT = 2*n - 1, donde
n = 8 es el número de nodos externos. Así, toda la figura 1.19 proporciona el árbol T requerido.

Figura 1.18 a. Algoritmo de Huffman.


22, 5, 11, 19, 2, 11, 25, 5
Ordenar datos de menor a mayor:
2, 5, 5, 11, 11, 19, 22, 25
Se suman los dos más pequeños, se escribe la lista nuevamente con ese resultado ordenada de forma ascendente:
2+5=7
5, 7, 11, 11, 19, 22, 25
Se repite el algoritmo:
5 + 7 = 12
11, 11, 12, 19, 22, 25
Se repite el algoritmo:
11 + 11 = 22
12, 19, 22, 22, 25
Se repite el algoritmo:
12 + 19 = 31
22, 22, 25, 31
Se repite el algoritmo:
22 + 22 = 44
25, 31, 44
Se repite el algoritmo:
25 + 31 = 56
44, 56
Se repite el algoritmo:
44 + 56 = 100

Figura 1.18 b) Árbol T


Nivel 0.
Raíz = 100
Nivel 1.
Hijo izquierdo de 100 = 44
Hijo derecho de 100 = 56
Nivel 2.
Hijo izquierdo de 44 = 22 (hoja A)
Hijo derecho de 44 = 22
Hijo izquierdo de 56 = 25 (hoja G)
Hijo derecho de 56 = 31
Nivel 3.
Hijo izquierdo de 22 = 11 (hoja F)
Hijo derecho de 22 = 11 (hoja C)
Hijo izquierdo de 31 = 12
Hijo derecho de 31 = 19 (hoja D)
Nivel 4.
Hijo izquierdo de 12 = 5 (hoja H)
Hijo derecho de 12 = 7
Nivel 5.
Hijo izquierdo de 7 = 2 (hoja E)
Hijo derecho de 5 = (hoja B)

Figura 1.19
Tabla:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
INFO A B C D E F G H
WT 22 5 11 19 2 11 25 5 7 12 22 31 44 56 10
0
LEFT 0 0 0 0 0 0 0 0 5 8 6 10 1 7 13
RIGHT 0 0 0 0 0 0 0 0 2 9 3 4 11 12 14

ROOT 15: 14

Observación.
Durante la ejecución del algoritmo de Huffman es necesario seguir la pista de los pesos actuales y encontrar dos
de los pesos mínimos. Esto puede lograrse en forma satisfactoria al mantener un mínheap auxiliar, donde cada
nodo contenga un peso y su ubicación en el árbol. Se usa un mínheap en lugar de un maxheap porque se quiere
que el nodo con el peso mínimo esté en la parte superior del montículo.

Aplicación a la codificación.
Suponga que una colección de n datos A1, A2, …, An va a codificarse por medio de cadenas de bits. Además,
suponga que los datos no ocurren con la misma probabilidad. Entonces es posible conservar espacio y tiempo de
memoria al utilizar cadenas de longitud variable, donde a los datos que ocurren frecuentemente se les asignan
cadenas más cortas y a los datos que ocurren con menor frecuencia se les asignan cadenas más largas. Por
ejemplo, este principio se aplica en los códigos telefónicos de países. El código de país para Estados Unidos es
simplemente 1; para Francia 33 y para Finlandia 358. En esta sección se analiza una codificación que utiliza
longitud variable que está basada en al árbol T de Huffman para datos ponderados; es decir, un árbol binario T
con longitud del camino mínimo P.
Código de Huffman.
Sea T el árbol de Huffman para los n datos ponderados A1, A2, …, An. A cada arista en T se asigna 0 o 1 según
si la arista apunta a un hijo izquierdo o a un hijo derecho. El código de Huffman asigna a cada nodo externo Ai
la secuencia de bits desde la raíz R del árbol T hasta el nodo A. El código de Huffman mencionado posee la
propiedad de los “prefijos”; es decir, el código de cualquier dato no es una subcadena inicial del código de
ningún otro dato. Esto significa que no puede haber ninguna ambigüedad al decodificar cualquier mensaje que
use un código de Huffman.

EJEMPLO 1.13
Considere nuevamente los ocho datos A, B, C, D, E, F, G, H del ejemplo 1.12. Suponga que los pesos
representan las probabilidades porcentuales de ocurrencia de los datos. Al asignar, como antes, etiquetas de bits
a las aristas en el árbol de Huffman en la figura 1.18b, es decir, al asignar 0 o 1 según si la arista apunta hacia un
hijo izquierdo o un hijo derecho, se obtiene el siguiente código para los datos:

A= 00
B = 11011
C = 011
D = 111
E = 11010
F = 010
G = 10
H = 1100

Por ejemplo, para llegar a E desde la raíz, el camino consta de una arista derecha, arista derecha, arista izquierda,
arista derecha y arista izquierda, con lo que se obtiene el código 11010 para E.

1.9 Árboles generales (con raíz ordenados), repaso.


Sea T un árbol con raíz ordenado, que también se denomina árbol general. T se define formalmente como un
conjunto no vacío de elementos, denominados nodos, tal que
1) T contiene un elemento distintivo R, denominado raíz de T.
2) Los elementos restantes de T constituyen una colección ordenada de cero o más árboles ajenos,
T1, T2, …, Tn.
Los árboles T1, T2, …, Tn se denominan subárboles de la raíz R, y las raíces de T1, T2, …, Tn se denominan
sucesores de R.
La terminología de relaciones familiares, teoría de grafos y de horticultura se usa para árboles generales de la
misma forma en que se hace para árboles binarios. En particular, si N es un nodo con sucesores S1, S2, …, Sn,
entonces N se denomina padre de los S sub i, los S sub i se denominan hijos de N y los S sub i se denominan
hermanos entre sí.

EJEMPLO 1.14
La figura 10.20a es una ilustración de un árbol general T con 13 nodos,
A, B, C, D, E, F, G, H, J, K, L, M, N
A menos que se establezca otra cosa, la raíz de un árbol T es el nodo en la parte superior del diagrama y los hijos
de un nodo se ordenan de izquierda a derecha. En consecuencia, A es la raíz de T, y A tiene tres hijos: el primer
hijo B, el segundo hijo C y el tercer hijo D. Observe que:
a) C tiene tres hijos.
b) Cada uno de B y K tiene dos hijos.
c) Cada uno de D y H tiene sólo un hijo.
d) Ninguno de E, F, G, L, J, M tiene hijos.
El último grupo de nodos, los que no tienen hijos, se denominan nodos terminales.
Observación:
Un árbol binario T no es un caso especial de un árbol general T. Son dos objetos distintos. A continuación, se
presentan sus dos diferencias básicas:
1) Un árbol binario T' puede estar vacío, pero un árbol general T no está vacío.
2) Suponga que un nodo N tiene sólo un hijo. Entonces en un árbol binario T' el hijo se identifica como hijo
izquierdo o hijo derecho, pero en un árbol general T no existe esta distinción.
La segunda diferencia se ilustra mediante los árboles T1 y T2 en la figura 1.20b. En cuanto a árboles binarios,
T1 y T2 son árboles distintos, ya que B es el hijo izquierdo de A en el árbol T1, pero B es el hijo derecho de A
en el árbol T2. Por otra parte, como árboles generales, entre T1 y T2 no hay ninguna diferencia.

Bosque.
Un bosque F se define como una colección ordenada de cero o más árboles generales distintos. Resulta evidente
que, si se elimina la raíz R de un árbol general T, entonces se obtiene el bosque F que consta de los subárboles
de R (que pueden estar vacíos). A la inversa, si F es un bosque, entonces es posible adjuntar un nodo R a F para
formar un árbol general T, donde R es la raíz de T y los subárboles de R constan de los árboles originales en F.

Figura 1.20 a
Nivel 0.
Raíz = A
Nivel 1.
Hijo izquierdo de A = B
Hijo medio de A = C
Hijo derecho de A = D
Nivel 2.
Hijo izquierdo de B= E (hoja)
Hijo derecho de B = F (hoja)
Hijo izquierdo de C = G (hoja)
Hijo medio de C = H
Hijo derecho de C = J (hoja)
Hijo medio de D= K
Nivel 3.
Hijo medio de H= L (hoja F)
Hijo izquierdo de K = M (hoja)
Hijo derecho de K = N (hoja D)

Figura 1.20 b1. Árbol T1


Nivel 0.
Raíz = A
Nivel 1.
Hijo izquierdo de A = B
Hijo derecho de A = No hay
Nivel 2.
Hijo izquierdo de B= C (hoja)
Hijo derecho de B = D (hoja)
Figura 1.20 b2. Árbol T2
Nivel 0.
Raíz = A
Nivel 1.
Hijo izquierdo de A = No hay
Hijo derecho de A = B
Nivel 2.
Hijo izquierdo de B= C (hoja)
Hijo derecho de B = D (hoja)

Árboles generales y árboles binarios.


Suponga que T es un árbol general. Entonces es posible asignar un único árbol binario T' a T como sigue. En
primer lugar, los nodos del árbol binario T' son los mismos que los nodos del árbol general T, y la raíz de T' es la
raíz de T. Sea N un nodo arbitrario del árbol binario T'. Entonces, el hijo izquierdo de N en T' es el primer hijo
del nodo N en el árbol general T y el hijo derecho de N en T' es el siguiente hermano de N en el árbol general T.
Esta correspondencia se ilustra en el problema 1.16.

Problemas Resueltos
1.1 Si T es el árbol binario almacenado en la memoria, como en la figura 1.21, dibuje el diagrama de T.
20 30 40 50 60 70 80 90 35 45 55 95
0 ] 0 0 2 0 0 7 0 3 11 0
0 13 0 0 6 8 0 14 12 4 0 0
Figura 1.21
El árbol T se dibuja desde su raíz R hacia abajo como sigue:
a) La raíz R se obtiene a partir del valor del apuntador ROOT. Observe que ROOT = 5. Por tanto, INFO[5]
= 60 es la raíz R de T.
b) El hijo izquierdo de R se obtiene a partir del campo del apuntador izquierdo de R. Observe que LEFT[5]
= 2. Por tanto, INFO[2] = 30 es el hijo izquierdo de R.
c) El hijo derecho de R se obtiene a partir del campo del apuntador derecho de R. Observe que RIGHT[5] =
6. Por tanto, INFO[6] = 70 es el hijo derecho de R.
Ahora ya es posible trazar la parte superior del árbol y luego, al repetir el proceso con cada nodo nuevo, al final
se obtiene todo el árbol T de la figura 1.22a.
22
Capítulo 1 Árboles binarios
Figura 1.22
1.2 Considere el árbol binario T en la figura 1.22b.
a) Encuentre la profundidad d de T.
b) Recorra T con el algoritmo en preorden.
c) Recorra T con el algoritmo en inorden.
d) Recorra T con el algoritmo en postorden.
e) Encuentre los nodos terminales de T, así como el orden en que son recorridos en los incisos b, c y d.
a) La profundidad d es el número de nodos en una rama más larga de T; por tanto, d = 4.
b) El recorrido en preorden de T es un algoritmo NLR recursivo; es decir, primero procesa un nodo N,
luego su subárbol izquierdo L y, por último, su subárbol derecho R. Al hacer que [A¡, . . . , Ak] denote un
subárbol con nodos A¡, . . . , Ak, el árbol T se recorre como sigue:
F- [A, K, C][D, H, G, B, E] o F- A - [K, C] - D - [H][G, B, E]
o finalmente,
F-A-K-C-D-H-G-B-E
c) El recorrido en inorden de T es un algoritmo LNR recursivo; es decir, primero procesa un subárbol
izquierdo L, luego su nodo N y, por último, su subárbol derecho R. Por tanto, T se recorre como sigue:
[A, K, C] - F - [D, H, G, B, E] o A - [K, C]-F - [H] - D - [G, B, E]
o finalmente,
A-K-C-F-H-D-B-G-E
d ) El recorrido en postorden de T es un algoritmo LRN recursivo; es decir, primero procesa un subárbol
izquierdo L, luego su subárbol derecho R y, por último, su nodo N. Por tanto, T se recorre como sigue:
[A, K, C][D, H, G, B, E] - F o [K, C] - A - [H][G, B, E] - D - F
o finalmente,
C-K-A-H-B-E-G-D-F
e) Los nodos terminales son los nodos sin hijos. Se recorren en el mismo orden en los tres algoritmos de
recorrido: C, H, B, E.
1.3 Sea T el árbol binario en la figura 1.22b. Encuentre la representación secuencial de T en la memoria.
1.9 Árboles generales (con raíz ordenados), repaso
23
La representación secuencial de T usa un simple arreglo TREE y un apuntador variable END.
a) La raíz R de T se almacena en TREE[1]; por tanto, R = TREE[1] = F.
b) Si el nodo N ocupa TREE[K], entonces sus hijos izquierdo y derecho se almacenan en TREE[2* K] y
TREE[2* K + 1], respectivamente. Así, TREE[2] = A y TREE[3] = D puesto que A y D son los hijos izquierdo y
derecho de F. Y así sucesivamente. La figura 1.23 contiene la representación secuencial de T. Observe que
TREE[10] = C, ya que C es el hijo izquierdo de K, que se almacena en TREE[5]. También, TREE[14] = B y
TREE[15] = E, ya que B y E son los hijos izquierdo y derecho de G, que se almacenan en TREE[7].
c) END apunta hacia la ubicación del último nodo de T; así, END = 15.
Por último, en la figura 1.23 se obtiene la representación secuencial de T.
F A D K H G C B
E
Figura 1.23
1.4 Considere los árboles T1, T2, T3 en la figura 1.24 e identifique los que representen el mismo árbol: a)
con raíz; b) con raíz ordenado; c) binario.
a) Los tres representan el mismo árbol con raíz; es decir, A es la raíz con hijos (sucesores inmediatos) B y
C, y C tiene el hijo único D.
b) Aquí T1 y T2 son el mismo árbol con raíz ordenado, pero T3 es diferente: B es el primer hijo de A en T1
y T2, pero es el segundo hijo de A en T3.
c) Todos representan árboles binarios distintos: específicamente, T1 y T2 son diferentes ya que es posible
distinguir entre sucesores izquierdos y derechos aun cuando sólo haya un sucesor (lo que no es cierto para
árboles con raíz ordenados). Es decir, D es un sucesor izquierdo de C en T1 pero es un sucesor derecho de C en
T2.
Figura 1.24
1.5 Un árbol binario T tiene nueve nodos. Representar T si los recorridos en preorden y en inorden de T
producen las siguientes secuencias de nodos:
Preorden: G B Q A C P D E R
Inorden: Q B C A G P E D R
El árbol T se dibuja a partir de su raíz R hacia abajo como sigue:
a) La raíz de T se obtiene al escoger el primer nodo en su preorden. Así, la raíz del árbol T es G.
24
Capítulo 1 Árboles binarios
b) El hijo izquierdo del nodo G se obtiene como sigue: primero se usa el inorden de T para encontrar los
nodos en el subárbol izquierdo T1 de G. Por tanto, T1 consta de los nodos Q, B, C, A que están a la izquierda de
G en el inorden de T. Luego, el hijo izquierdo de G se obtiene al escoger el primer nodo (raíz) en el preorden de
T1 que aparece en el preorden de T. Por tanto, B es el hijo izquierdo de G.
c) En forma semejante, el subárbol derecho T2 de G consta de los nodos P, E, D, R y P es la raíz de T2; es
decir, P es el hijo derecho de G.
Al repetir el proceso anterior con cada nodo nuevo, el árbol requerido T se obtiene finalmente en la figura 1.25a.
1.6 Considere la expresión algebraica E = (2x + y)(5a - b)3. a) Trace el 2-árbol correspondiente. b) Use T
para escribir E en forma de prefijo polaco.
a) A fin de obtener el árbol en la figura 1.25b se usa una flecha (f) para exponenciación, un asterisco (*)
para multiplicación y una línea inclinada (/) para división.
b) El árbol se examina desde la izquierda como en la figura 1.4b, para obtener
*+*2xyf—*5ab3
1.7 Trace todos los posibles a) árboles binarios T no semejantes con tres nodos; b) árboles
binarios T' no semejantes con cuatro nodos externos.
a) Hay cinco árboles T así, que se muestran en la figura 1.26a.
b) Cada 2-árbol T ' con cuatro nodos externos se determina por un árbol binario T con tres nodos; es decir,
por un árbol T del inciso a. Por tanto, hay cinco árboles 2-binarios T', se muestran en la figura 1.26b.
1.9 Árboles generales (con raíz ordenados), repaso
25
Árboles binarios de búsqueda, montículos
1.8 Considere el árbol binario T en la figura 1.22a. a) ¿Por qué T es un árbol binario de búsqueda? b) Si al
árbol se agrega ITEM = 33, encuentre el nuevo árbol T.
a) T es un árbol binario de búsqueda, puesto que cada nodo N es mayor que los valores en su subárbol izquierdo
y menores que los valores en su subárbol derecho.
b) ITEM = 33 se compara con la raíz 60. Puesto que 33 < 60, el desplazamiento es hacia el hijo izquierdo, 30.
Puesto que 33 > 30, el desplazamiento es hacia el hijo derecho, 55. Puesto que 33 < 55, el desplazamiento es
hacia el hijo izquierdo, 35. Ahora, 33 < 35, pero 35 no tiene hijo izquierdo.
Por tanto, ITEM = 33 se agrega como un hijo izquierdo del nodo 35 para obtener el árbol en la figura 1.27a. Las
aristas sombreadas indican el camino en el árbol durante la inserción.
Ai
30 70 \
/ \ 20 55 / \ 90 / \ A2 \<
/ 35 / \ 80 95 \
/\
33 45 / \
/ \ 40 50
a) b)
Figura 1.27
1.9 Suponga que n datos A1, A2,..., AN ya están ordenados; es decir, A1 < A2 < • • • < AN.
a) Si los datos se insertan en orden en un árbol binario vacío T, describir el árbol final T.
b) ¿Cuál es la profundidad d del árbol final T?
c) Compare d con la profundidad media d* de un árbol binario con n nodos para i) n = 50; ii) n = 100; iii) n =
500.
a) El árbol T consta de una rama que se extiende hacia la derecha, como se muestra en la figura 1.27b.
b) La rama de T tiene n nodos; así, d = n.
c) Se sabe que d* = c log2 n, donde c k 1.4. Por tanto, i) d(50) = 50, d*(50) 9; ii) d(100) = 100, d*(100) « 10; iii)
d(500) = 500, d*(500) « 12.
1.10 Suponga que la siguiente lista de letras se inserta en un árbol binario de búsqueda vacío:
J, R, D, G, W, E, M, H, P, A, F, Q
a) Encuentre el árbol final T. b) Encuentre el recorrido inorden de T.
a) Los nodos se insertan uno después del otro para obtener el árbol T en la figura 1.28a.
b) A continuación se muestra el recorrido inorden de T:
A, D, E, F, G, H, J, M, P, Q, R, W
26
Capítulo 1 Árboles binarios
J.. ,J
D R E R
/\ /\ /\ /\
A G M W A G P w
/\ \ /\ \
E H p F H Q
\ \
F Q
«) b)
Figura 1.28
Es el listado alfabético de las letras. (El recorrido inorden de cualquier árbol binario T de búsqueda produce una
lista ordenada de los nodos.)
1.11 Considere el árbol binario T de la figura 1.28a, describa el árbol T después que se han eliminado a) el
nodo M y b) el nodo D.
a) El nodo M tiene sólo un hijo, P. Por tanto, se elimina M y se deja que P se vuelva el hijo izquierdo de R en
lugar de M.
b) El nodo D tiene dos hijos. Se encuentra el sucesor inorden de D, que es el nodo E. Primero se elimina E del
árbol y luego D se sustituye por el nodo E.
En la figura 1.28b se muestra el árbol T actualizado.
1.12 Sea H el minheap en la figura 1.29a. (H es un minheap puesto que los elementos más pequeños están en
la parte superior del montículo, en lugar de los elementos más grandes.) Describa el montículo después que se ha
insertado ITEM = 11 en H.
22 33
25 44 40 55
55 33
b)

Figura 1.29
Primero se inserta ITEM como el nodo siguiente en el árbol completo; es decir, como el hijo izquierdo del nodo
44. Luego, se compara ITEM con su PARENT y se intercambian ITEM y PARENT hasta que ITEM <
PARENT. Puesto que 11 < 44, se intercambian 11 y 44. Puesto que 11 < 22 se intercambian 11 y 22. Debido a
que 11 > 8, ITEM = 11 ha encontrado su sitio apropiado en el montículo H. En la figura 1.29b se muestra el
montículo final H. Las aristas sombreadas indican el camino de ITEM a medida que se desplaza por el árbol.

Longitudes de caminos, algoritmo de Huffman


1.13 Sea T el árbol binario ponderado en la figura 1.30a. Encuentre la longitud del camino ponderado P del
árbol T.
1.9 Árboles generales (con raíz ordenados), repaso
27
Cada peso se multiplica por la longitud del camino que va de la raíz de T al nodo que contiene el peso, y luego
todos estos productos se suman para obtener P. Así:
P = 4(2) + 15(4) + 25(4) + 5(3) + 8(2) + 16(2)
= 8 + 60 + 100 + 15 + 16 + 32
= 231
1.14 Con los seis pesos 4, 15, 25, 5, 8, 16, encuentre un árbol binario T con los pesos dados y con una
longitud del camino mínimo P. (Compare T con el árbol en la figura 1.30a.)
Se usa el algoritmo de Huffman. Es decir, se combinan en forma repetida los dos subárboles con pesos mínimos
en un simple subárbol como sigue:
a) 4, 15, 25, 5, 8, 16; d) 25, 17,
b) 15, 25, 16; e) 31;
c) 15, 25, 16; f)
Figura 1.30
(El número encerrado en un círculo indica la raíz del nuevo subárbol en el paso.) El árbol T se traza a partir del
paso f ) hacia atrás, con lo que se obtiene la figura 1.30b. La longitud del camino de T es la siguiente:
P = 25(2) + 4(4) + 5(4) + 8(3) + 15(2) + 16(2)
= 50 + 60 + 20 + 24 + 30 + 32
= 172
(La longitud del camino del árbol en la figura 1.30a es 231.)
1.15 Si los datos A, B, C, D, E, F, G ocurren con la siguiente distribución de probabilidad:
Dato: A B C D E F G
Probabilidad: 10 30 5 15 20 15 5
Encuentre un código Huffman para los datos.
Así como en la figura 1.31a, el algoritmo de Huffman se aplica para encontrar un árbol binario con una longitud
del camino ponderado mínimo P. (De nuevo, el número encerrado en un círculo indica la raíz del nuevo subárbol
en el paso.) El árbol T se traza a partir del paso g) hacia atrás, con lo que se obtiene la figura 1.31b. Se asignan
etiquetas de bits a las aristas del árbol T, 0 a una
28
Capítulo 1 Árboles binarios
arista izquierda y 1 a una arista derecha, como en la figura 1.31b. El árbol T produce el siguiente código de
Huffman:
A : 000; B : 11; C : 0010; D : 100; E : 01; F : 101; G : 0011
a) 10, 30, 5, 15, 20, 15, 5
b) 10, 30, @ 15, 20, 15,
c) @30, 15, 20, 15
d) 20, 30, @ 20
e) @30, 30
/) 40 @
g)
a)
b)
Figura 1.31
* Árboles g
enerales
1.16 Sea Tel árbol general en la figura 1.32a. Encuentre el árbol binario T' correspondiente.
Los nodos de T ' son los mismos que los nodos del árbol general T. En particular, la raíz de T ' es la misma que
la raíz de T. Además, si N es un nodo en el árbol binario T', entonces su hijo izquierdo es el primer hijo de N en
T y su hijo derecho es el siguiente hermano de N en T. Al construir T' a partir de la raíz se obtiene el árbol en la
figura 1.32b.
L E HK
\
M
d) b)
Figura 1.32

Problemas suplementarios
1.17 Considere el árbol binario T en la figura 1.33a.
a) Encuentre: i) la profundidad d de T; ii) los descendientes de B.
b) Recorra T en i) preorden; ii) inorden; iii) postorden.
c) Encuentre los nodos terminales de T y los órdenes en que se recorren en el inciso b).
1.9 Árboles generales (con raíz ordenados), repaso
29
1.18 Repita el problema 10.17 para el árbol binario T en la figura 1.33b.
1.19 Repita el problema 10.17 para el árbol binario T en la figura 1.33c.
A A A
C E C
/\ \ / /\ \ /
D E F c F G D E
/\ \ / / \
G H D H F H
«) ¿) \ G c)
Figura 1.33
1.20 Sea T el árbol binario almacenado en la memoria como en la figura 1.34, donde ROOT = 14.
a) Dibuje el diagrama de T.
b) Recorra T en i) preorden; ii) inorden; iii) postorden.
c) Encuentre la profundidad d de T.
d ) Encuentre el número mínimo de ubicaciones requeridas para un arreglo lineal TREE si T se almacena
secuencialmente en TREE.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
16 17 18
INFO
LEFT
RIGHT
H R P B E C F Q S A
K L D
4 0 0 18 1 0 15 0 0 5
2 0 0
11 0 0 7 0 10 16 12 0 9
0 0 0
Figura 1.34
1.21 Suponga que los recorridos en preorden y en inorden de un árbol binario T producen las siguientes
secuencias de nodos:
Preorden: G, B, Q, A, C, K, F, P, D, E, R, H
Inorden: Q, B, K, C, F, A, G, P, E, D H, R
a) Dibuje el diagrama de T.
b) Encuentre: i) la profundidad d de T; ii) los descendientes de B.
c) Enumere los nodos terminales de T.
1.22 Considere la expresión algebraica E = (x + 3y)4(a - 2b). a) Dibuje el árbol binario correspondiente. b)
Escriba E en forma de prefijo polaco.

Árboles binarios de búsqueda, montículos


1.23
Encuentre el árbol final T si los números siguientes se insertan en un árbol binario de búsqueda vacío T:
50, 33, 44, 22, 77, 35, 60, 40
1.24 Encuentre el montículo final H si los números en el problema 1.23 se insertan en un maxheap vacío H.
30
Capítulo 1 Árboles binarios
1.25 Encuentre el montículo final H si los números en el problema 1.23 se insertan en un minheap vacío H.
1.26 Sea T el árbol binario de búsqueda en la figura 1.35a. Suponga que los nodos 20, 55, 88 se insertan uno
después del otro en T. Encuentre el árbol final T.
1.27 Sea T el árbol binario de búsqueda en la figura 1.35a. Suponga que los nodos 22, 25, 75 se eliminan uno
después del otro en T. Encuentre el árbol final T.
1.28 Sea H el montículo en la figura 1.35b. Encuentre el montículo final H si los números 65, 44 y 75 se
insertan uno después del otro en H.
1.29 Sea H el montículo en la figura 1.35b. Encuentre el montículo final H si de H se eliminan la raíz y luego
la siguiente raíz.
25 75
z\ /\
22 40 60 90
/\ /
15 30 44 80
\
33
a)
*)
Figura 1.35
Algoritmo de
Huffman, árboles generales
1.30 Considere el árbol binario T en la figura 1.36a, que contiene las letras A, B, C, D, E, F, G como nodos
externos. Encuentre la codificación de Huffman de las letras determinada por el árbol T.
1.31 Encuentre la longitud del camino ponderado P del árbol en la figura 1.36a si a los datos A, B, . . . , G se
asignan los pesos siguientes:
(A, 13), (B, 2), (C, 19), (D, 23), (E, 29), (F, 5), (G, 9)
1.32 Use los datos del problema 1.31 a fin de encontrar una codificación de Huffman para las siete letras
usando un árbol binario con una longitud del camino mínimo P, y encuentre P.
1.33 Sea Tel árbol general en la figura 1.36b. Encuentre el árbol binario T' correspondiente.
Figura 1.36
1.9 Árboles generales (con raíz ordenados), repaso
31
Problemas en computadora
Los problemas del 1.34 al 1.40 se refieren a la figura 1.37, que es una lista de registros de empleados almacenada
en la memoria. Se trata de un árbol binario de búsqueda con respecto a la llave NAME. Usa un apuntador HEAD
donde el número de empleados está en SSN[HEAD], el salario total está en SALARY[HEAD], y la raíz del árbol
está en LEFT[HEAD]. También, a fin de permitir inserciones, las ubicaciones disponibles (vacías) forman una
lista ligada donde AVAIL apunta hacia el primer elemento en la lista y el enlace se mantiene por medio del
arreglo LEFT.
ÑAME
SSN
SEX
HEAD
AVAIL

Davis
Kelly
Green

Brown
Lewis

Cohén
Rubin

Evans

Harris

192-38-7282
165-64-3351
175-56-2251
0009
178-52-1065
181-58-9939

177-44-4557
135-46-6262

168-56-8113

208-56-1654

Female
Male
Male

Female
Female

Male
Female

Male

Female

22 800
19 000
27 200
191 600
14 700
16 400

19 000
15 500

34 200

22 800
SALARY
0
0
0
2
14
0
3
11
6
0
13
0
1
9
12
0
0
0
0
10

4
0

7
Figura 1.37
1.34 Dibuje un diagrama del árbol binario de búsqueda NAME.
1.35 Escriba un programa que imprima la lista de registros de los empleados en orden alfabético. (Sugerencia:
imprima los registros en inorden.)
1.36 Escriba un programa que lea el nombre NNN de un empleado e imprima el registro del empleado.
Pruebe el programa usando a) Evans, b) Smith y c) Lewis.
1.37 Escriba un programa que lea el número de seguridad social SSS de un empleado e imprima el registro
del empleado. Pruebe el programa usando a) 165-64-3351, b) 135-46-626 y c ) 177-44-5555.
1.38 Escriba un programa que lea un entero K e imprima el nombre de cada empleado varón cuando K = 1 o
el nombre de cada empleada cuando K = 2. Pruebe el programa usando a) K = 2; b) K = 5, y c) K = 1.
1.39 Escriba un programa que lea el nombre NNN de un empleado y elimine de la estructura el registro del
empleado. Pruebe el programa usando a) Davis; b) Jones, y c) Rubin.
1.40 Escriba un programa que lea el registro de un nuevo empleado e inserte el registro en el archivo. Pruebe
el programa usando:
a) Fletcher; 168-52-3388; Mujer; 21 000;
b) Nelson; 175-32-2468; Hombre; 19 000
32
Capítulo 1 Árboles binarios
Respuestas a los problemas suplementarios
1.17 a) 4; D, E, G, H; b) ABDEGHCF, DBGEHACF, DGHEBFCA; c) Los tres: D, G, H, F.
1.18 a) 4; C, D; b) ABCDEFGH, CDBAFEHG, DCBFHGEA; c) Los tres: D, F, H.
1.19 a) 5; D, F, G; b) ABDFGCEH, BFGDAEHC, GFDBHECA; c) Los tres: G, H.
1.20 a) Vea la figura 1.38a; b)
ABDEHPQSCFKRL,
DBPHQSEACRKFL,
DPSQHEBRKLFCA; c) d = 6; por
tanto 32 < END = 64; aquí END = 43.
1.21 a) Vea la figura 1.38b; b) 5; QACKF;
c) Q, K, F, E, H.
1.22 a) Vea la figura 1.39a; b) * f +x * 3y4
- a * 2b
b)
Figura 1.38
1.23 Vea la figura 1.39b.
1.24 Nivel por nivel: 77, 50, 60, 40, 33, 35, 44, 22.
1.25 Nivel por nivel: 22, 33, 35, 40, 77, 44,
60, 50.
40
a) b)
Figura 1.39
1.26 Vea la figura 1.40a.
1.27 Vea la figura 1.40b.
1.28 Nivel por nivel: 75, 65, 70, 40, 55, 60, 11, 30, 25, 15, 50, 22, 44.
1.9 Árboles generales (con raíz ordenados), repaso
33
22 40 60 90
90
20 33 88
a)
Figura 1.40
b)
1.29 Nivel por nivel: 55, 50, 22, 40, 25, 15, 11, 30. 1.32 A: 000; B: 00101; C: 10; D: 11; E: 01; F: 00100;
G: 0011; P = 257.
1.30 A: 00; B: 0100; C: 10; D: 011; E: 01010; F: 01011; G: 11. 1.33 Vea la figura 1.41a.
1.34 Vea la figura 1.41b, donde sólo se usa
1.31 P = 329. la primera letra de cada nombre.
Figura 1.41

También podría gustarte