Árbol: definición y representación de árboles binarios
1. Árbol: definición
Árbol (del latín arbor –oris):
Planta perenne, de tronco leñoso y elevado, que se
ramifica a cierta altura del suelo.
(otras, ver Real Academia Española…)
Árboles binarios
Franco Guidi Polanco
Escuela de Ingeniería Industrial
Pontificia Universidad Católica de Valparaíso, Chile
fguidi@ucv.cl
Actualización: 13 de mayo de 2005
Franco Guidi Polanco 2
Árbol: definición (cont.) Árbol: definición (cont.)
Árbol: Árbol:
Grafo conexo, no orientado y acíclico. Una estructura de datos accesada desde un nodo raíz.
Cada nodo es ya sea una hoja o un nodo interno. Un
nodo interno tiene uno o más nodos hijos, y se le llama
padre de sus nodos hijos.
C
A E Un árbol es, ya sea:
• un conjunto vacío, o
B • una raíz con cero
D o más árboles
H
Franco Guidi Polanco 3 Franco Guidi Polanco 4
2. Hojas y nodos internos Representación de un árbol
Una hoja es cualquier nodo que tiene sus hijos a
raíz
vacíos.
Un nodo interno es cualquier nodo con al menos
subárbol
un hijo no vacío.
b c d e
a Nodos internos
b c f g h i j subárbol
k
d e f l m subárbol
Hojas g h subárbol
Franco Guidi Polanco 5 Franco Guidi Polanco 6
Representación de un árbol (cont.) Nodos padres e hijos
a Las raíces de los subárboles de un árbol son hijos
de la raíz del árbol.
Existe un arco desde cada nodo a cada uno de sus
hijos, y se dice que este nodo es padre de sus
b c d hijos.
e
f g h i j k
l m subárbol de nodo e
subárboles de
nodo b subárboles de
nodo c
Franco Guidi Polanco 7 Franco Guidi Polanco 8
3. Ruta y largo de una ruta Ancestros y descendientes
Si n1, n2,... nk es una secuencia de nodos en un Si existe una ruta desde un nodo A a un nodo B,
árbol, de modo que ni es padre de ni + 1, para entonces A es ancestro de B y B es
1<=i<=k, entonces esta secuencia se llama ruta descendiente de A.
desde n1 a nk. Luego, todos los nodos de un árbol son
El largo de esta ruta es k. descendientes de la raíz del árbol, mientras que la
raíz es el ancestro de todos los nodos.
a n1
b c n2
d e f
n3
g h
Franco Guidi Polanco 9 Franco Guidi Polanco 10
Altura Niveles
La altura de un nodo M de un árbol corresponde Todos los nodos de altura d están en el nivel d en
al número de nodos en la ruta desde la raíz hasta el árbol.
M. La raíz está en el nivel 1, y su altura es 1.
La altura de un árbol corresponde a la altura del
nodo más profundo.
Nivel 1 a
a Nivel 2 b c
Altura del
b c nodo=2
Altura del árbol=4 Nivel 3 d e f
d e f
Nivel 4 g h
g h
Franco Guidi Polanco 11 Franco Guidi Polanco 12
4. Árboles binarios Representación de un árbol binario (I)
Un A.B. está constituido por un conjunto finito de
elementos llamados nodos. raíz
subárbol izquierdo
a subárbol derecho
Un árbol binario:
no tiene nodos (está vacío); o b c
tiene un nodo llamado raíz, junto con otros dos árboles
binarios llamados subárboles derecho e izquierdo
d e f
de la raíz. g h
Nota: Una parte importante del material presentado en esta sección
fue elaborado por Marcelo Silva F.
Franco Guidi Polanco 13 Franco Guidi Polanco 14
Representación de un árbol binario (II) Igualdad de árboles binarios
Para ser iguales, dos árboles deben tener tanto la
misma estructura, como el mismo contenido.
raíz
a
subárbol derecho
b c
d e f
subárbol izquierdo a a
g h ≠
b b
Franco Guidi Polanco 15 Franco Guidi Polanco 16
5. Árboles binarios llenos Árboles binarios completos
Un árbol binario lleno es aquel en que cada nodo Un árbol binario completo tiene una forma
es un nodo interno con dos hijos no vacíos, o una restringida, que se obtiene al ser llenado de
hoja. izquierda a derecha. En un A.B. Completo de
altura d, todos los niveles, excepto posiblemente el
nivel d están completamente llenos.
a a
b c b c
a
d e f e f Es un A.B. completo b c
pero no es un A.B. lleno
g h g h
d e f
No es A.B. lleno Es A.B. lleno
Franco Guidi Polanco 17 Franco Guidi Polanco 18
Representación de árboles binarios mediante
Número de nodos en un árbol binario
nodos y referencias
El máximo número de nodos en el nivel i de un
árbol binario es 2(i-1).
El máximo número de nodos en un árbol binario
a
de altura K es 2(K)-1.
b c
d e
f
Franco Guidi Polanco 19 Franco Guidi Polanco 20
6. Diagrama de clases de un árbol binario Diagrama de objetos de un árbol binario
Diagrama de clases árbol binario de enteros: :ABB
root:ABBNode
ABB ABBNode
1..1 data:int data:20
insert(i:int)
find(d:Data):boolean root setData(i:int)
delete(i:int) getData():int :ABBNode :ABBNode
setLeft(n:ABBNode)
getLeft():ABBNode data:7 data:32
left setRight(n:ABBNode) right
getRight():ABBNode
isLeaf():boolean
:ABBNode :ABBNode :ABBNode
data:2 data:15 data:40
Franco Guidi Polanco 21 Franco Guidi Polanco 22
Representación de árboles binarios mediante
Recorrido de árboles binarios
arreglos
Si la raíz de un subárbol se almacena en A[i], su Un recorrido es cualquier proceso destinado a
hijo izquierdo se almacena en A[2*i], y su hijo visitar los nodos de un árbol binario en un
derecho en A[2*i+1]. determinado orden.
Cualquier recorrido que visite cada nodo
a exactamente una vez, se denomina una
enumeración de los nodos del árbol.
b c Recorridos de enumeración a analizar:
Preorden
d e f Inorden
Postorden
g h
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
a b c d e f g h
Franco Guidi Polanco 23 Franco Guidi Polanco 24
7. Recorrido en Preorden Código para recorrido Preorden
Dado un árbol binario:
void preorder(BinNode rt) // rt es la raíz del subarbol
{
1) Visitar su raíz. if (rt==null)
2) Recorrer en preorden su subárbol izquierdo. return;
visit(rt)
// subarbol vacío
// hace algo con el nodo
3) Recorrer en preorden su subárbol derecho. preorder(rt.left());
preorder(rt.right());
}
1
2 3
Franco Guidi Polanco 25 Franco Guidi Polanco 26
Ejemplo de recorrido en Preorden Recorrido en Inorden
Dado un árbol binario:
a
1
b c 1) Recorrer en inorden su subárbol izquierdo.
2 3
d e f 2) Visitar su raíz.
3) Recorrer en inorden su subárbol derecho.
g h
i
2
j k
1 3
a b d c e f g i j k h
Franco Guidi Polanco 27 Franco Guidi Polanco 28
8. Código para recorrido Inorden Ejemplo de recorrido en Inorden
2 a
void inorder(BinNode rt) // rt es la raíz del subarbol
{ 1 3 b c
if (rt==null)
return; // subarbol vacío
inorder(rt.left()); d e f
visit(rt) // hace algo con el nodo
}
inorder(rt.right()); g h
i
j k
d b a e c g j i k f h
Franco Guidi Polanco 29 Franco Guidi Polanco 30
Recorrido en Postorden Código para recorrido Postorden
Dado un árbol binario:
void postorder(BinNode rt) // rt es la raíz del subarbol
{
1) Recorrer en postorden su subárbol izquierdo. if (rt==null)
2) Recorrer en postorden su subárbol derecho. return; // subarbol vacío
postorder(rt.left());
3) Visitar su raíz. postorder(rt.right());
visit(rt) // hace algo con el nodo
}
3
1 2
Franco Guidi Polanco 31 Franco Guidi Polanco 32
9. Ejemplo de recorrido en Postorden Árbol binario de búsqueda
a Supongamos que tenemos un conjunto de n
3 elementos que pueden ser ordenados por alguna
1 2 b c clave.
En un árbol binario de búsqueda (ABB), todos
d e f los nodos almacenados en el subárbol izquierdo de
g h un nodo cuyo valor clave es C tienen claves
menores que C, mientras que todos los nodos
i ubicados en el subárbol derecho tienen claves
mayores que C.
j k
d b e j k i g hf c a
Franco Guidi Polanco 33 Franco Guidi Polanco 34
Ejemplos de árboles binarios de búsqueda Ingreso de elementos a un ABB
a
{ 10, 5, 7, 15, 14, 12, 18 } { 15, 18, 14, 5, 10, 12, 7 }
b c 15
c
d e f 10 14 18
<c >c No es ABB
5 15
5
Definición de ABB c
7 14 18 10
b e
12 7 12
a d f
Es ABB
Franco Guidi Polanco 35 Franco Guidi Polanco 36
10. ABB de referencia Ingreso de elementos a un ABB (cont.)
ABB
insert(e:Element)
find(key:int):Element Element
delete(i:int):Element ABBNode {interface} private BinNode insert (BinNode rt, Element val)
1 {
data getKey():int if (rt == null)
1 setData(e:Element) return new BinNode(val);
root getData():Element Element it = (Element)rt.element();
setLeft(n:ABBNode) if (it.key() > val.key())
getLeft():ABBNode rt.setLeft(insert(rt.left(), val));
setRight(n:ABBNode)
left right else
getRight():ABBNode
rt.setRight(insert(rt.right(), val));
isLeaf():boolean
return rt;
}
Franco Guidi Polanco 37 Franco Guidi Polanco 38
Características del ingreso de elementos a un ABB Recorrido Inorden en ABB
Los elementos agregados a un ABB siempre son
15
incorporados inicialmente como hojas.
Un conjunto de elementos dado puede generar 10 14 18
diversos ABB, dependiendo del orden en que son 5 15
ingresados. 5
7 14 18 10
12 7 12
5 7 10 12 14 15 18 5 7 10 12 14 15 18
Franco Guidi Polanco 39 Franco Guidi Polanco 40
11. Características del recorrido Inorden de un ABB Búsqueda en ABB
Si bien existen muchos ABBs posibles para un Para hallar un elemento con clave C, en un
mismo conjunto de elementos, el recorrido árbol A:
Inorden de todos estos árboles siempre entrega el Si la raíz del árbol A almacena C, la búsqueda
conjunto ordenado de menor a mayor. termina exitosamente.
Si C es menor que el valor de la raíz de A, buscar
en el subárbol izquierdo. Si C es mayor que el
valor de la raíz, buscar en el subárbol derecho.
La búsqueda termina al hallar el valor C, o al
pretender buscar en un subárbol vacío.
Franco Guidi Polanco 41 Franco Guidi Polanco 42
Búsqueda en ABB (cont.) Ejemplo de búsqueda en ABB
10 10
Elem find(BinNode rt, int key) {
if (rt == null) 5 15 5 15
return null;
Element it = (Element)rt.element();
if ((int)it.key() > key) 7 14 18 7 14 18
return find(rt.left(), key);
else if (it.key() == key)
return it; 12 12
else
return find(rt.right(), key);
} Buscar 12 Buscar 16
Búsqueda exitosa Búsqueda infructuosa
Franco Guidi Polanco 43 Franco Guidi Polanco 44
12. Eliminar nodo que es una hoja o tiene a lo más
Eliminación de elementos de un ABB
un hijo
Se pueden presentar tres casos:
El elemento no existe. 10 10
El elemento es una hoja o tiene a lo más un hijo.
5 15 7 15
El elemento tiene dos hijos.
7 14 18 14 18
12 12
Franco Guidi Polanco 45 Franco Guidi Polanco 46
Ejemplo eliminación de nodo con dos hijos Eliminar nodo con dos hijos
1. Hallar el nodo que contiene el menor de los
10 10
elementos mayores del nodo a eliminar (el
5 15 5 16 elemento más a la izquierda de su subárbol
derecho)
7 14 18 7 14 18 2. Reemplazar los datos del nodo eliminar con
los del nodo hallado.
16 17 3. Eliminar el nodo hallado, que tiene a lo más
El menor de los un hijo, con el procedimiento descrito
17 elementos
mayores previamente.
(Nodo más a la
izquierda del
subárbol derecho)
Franco Guidi Polanco 47 Franco Guidi Polanco 48
13. Importancia de una estructura balanceada en los
Utilidad de los árboles binarios de búsqueda
ABB
Al buscar, el ABB permite descartar a priori un La estructura de un ABB es importante al
subconjunto de elementos, en forma análoga a la momento de realizar búsquedas en él.
búsqueda binaria en arreglos ordenados.
El ABB presenta además la ventaja de poder ser
18
implementado con punteros (estructura dinámica). 10
La incorporación y eliminación de elementos al 15
5 15
ABB es mas rápida que en arreglos ordenados. 14
3 7 14 18 10
7
En el peor de los casos se En el peor de los
hacen 3 iteraciones para 5 casos se hacen 7
una búsqueda. iteraciones para
3 una búsqueda.
Franco Guidi Polanco 49 Franco Guidi Polanco 50