Академический Документы
Профессиональный Документы
Культура Документы
Website: http://yalma.fime.uanl.mx/~romeo/ED/2011/
Sesiones: 48
Material de apoyo:
Estructura de Datos con C y C++.
Yedidyah Langsam, Moshe J. Augenstein, Aaron M. Tenenbaum, Brooklyn College
Segunda Edicin, Prentice-Hall.
Estructura de Datos.
Romn Martnez, Elda Quiroga.
Thomson Learning.
Software:
Compiladores GCC (GNU Compiler Collection)
Temario:
rboles en general
rboles binarios
rboles balanceados
rboles multicaminos
rboles
En Informtica, los rboles son abstracciones matemticas que
juegan un rol central en el diseo y anlisis de algoritmos, porque:
Los usamos para describir propiedades dinmicas de los algoritmos
Construimos estructuras de datos que son realizaciones concretas de
rboles.
El resto de los nodos se les conoce como rama, ya que tienen padre y
uno o varios hijos.
rboles
En computacin, usualmente se usa el trmino rbol para referirse a un
rbol con raz. Mientras que se asume el trmino rbol libre para
referirse a la estructura ms general.
Un recorrido es una sucesin de nodos del rbol de tal forma que entre
cada dos nodos consecutivos de la sucesin hay una relacin de
parentesco.
rboles: Definicin General
Existen dos recorridos tpicos para listar los nodos de un rbol: en
profundidad y en anchura.
descendiente hermanos
hoja
rboles Binarios
Nivel de un rbol binario: La raz del rbol tiene el nivel 0, y el nivel de
cualquier otro nodo en el rbol es uno ms el nivel de su padre.
Nivel = 0
Nivel = 1
Nivel = 2
Nivel = 3
Profundidad
d e f g
isLeft(d) = true isLeft(e) = false isRight(g) = true
Note que si no existe un nodo que satisfaga cualquiera de las funciones anteriores, se
retorna un nulo (null) entonces.
return right(father(p))
return left(father(p))
Operaciones adicionales:
-makeTree(p) : Crea un rbol binario con un nodo nico (raz)
- setLeft(p, x) : Establece un nodo x como hijo izquierdo de otro nodo p,
siempre y cuando p no tenga un hijo del lado izquierdo ya establecido.
- setRight(p, x) : Similar a la funcin anterior.
rboles Binarios: Aplicacin de Ejemplo
Los rboles binarios son tiles cuando se toman decisiones en dos
sentidos en cada punto del proceso.
Ejemplo: Encontrar todos los duplicados en una lista de nmeros:
{15,4,8, 7, 4, 3, 19, 5, 7, 9, 16, 5,17}
Algoritmo: Primer elemento es la raz, subsecuentes elementos se
colocan a la izquierda si son menores o a la derecha si son mayores.
Si son duplicados no se insertan pero se reportan.
15 15 15 15 15
4 4 4 4 4
8 8 3 8
7 7
rboles Binarios: Aplicacin de Ejemplo
{15,4,8, 7, 4, 3, 19, 5, 7, 9, 16, 5,17}
15 15 15
4 19 4 19 4 19
3 8 3 8 3 8 16
7 7 7 9 17
5 5
rboles Binarios: Aplicacin de Ejemplo
Pseudocdigo:
15
int numbers[13] = {15,4,8, 7, 4, 3, 19, 5, 7, 9, 16, 5,17};
tree = makeTree(numbers[0]);
for(int i=1;i<length(numbers);i++){
4 19
p = q = tree;
while(numbers[i] !=info(p) && q!=NULL){
p = q;
if(numbers[i]<info(p)) 3 8 16
q = left(p);
else
q = right(p); 7 9 17
}
if(numbers[i] == info(p))
cout<<Numero repetido; 5
else if(numbers[i] < info(p))
setleft(p,numbers[i]);
else
setright(p, numbers[i]);
}
Ejemplo 2: Expresiones
La raz del rbol binario contiene un operador que se aplicar a la
evaluacin de las expresiones representadas por sus subrboles
izquierdo y derecho.
Los operandos son nicamente hojas en el rbol
+
$
A *
+ *
A+B*C B C
A * + C
B C A B
+ C
(A+B*C)$((A+B)*C)
A B (A+B)*C
Representacin bsica de un rbol binario
struct tnode {
int info;
struct tnode * father; //No necesario
struct tnode * left;
struct tnode * right; Info L F R
};
p
typedef struct tnode * TNODEPTR;
TNODEPTR createNode() {
TNODEPTR p = (TNODEPTR)
malloc(sizeof(struct tnode));
return p;
}
void freeNode(TNODEPTR P) {
free( p);
}
Representacin bsica de un rbol binario
TNODEPTR makeTree(int x) {
TNODEPTR root = createNode();
root->info = x;
root->father = NULL;
root->left = NULL; X NULL NULL NULL
root->right = NULL;
return root;
}
TNODEPTR father(TNODEPTR pNode) {
return pNode->father;
}
X N N N X N N
pNode->left=
father
a
b c sibling(c) ?
d e f g
rbol binario de bsqueda u ordenado
El ejemplo anterior introdujo el rbol binario de bsqueda o
rbol binario ordenado
Este tipo de rbol tiene todos sus nodos en orden, para cada
nodo X:
Todos los elementos de su rbol izquierdo son menores o iguales a X,
Mientras los nodos en su rbol derecho son mayores a X.
4 19
//Dado un rbol binario, inserta un
//nuevo nodo en el lugar correcto del arbol.
TNODEPTR insert(TNODEPTR pNode, int data){ 3 8 16
//1: Si el arbol esta vacio retorna
//un nodo unico
if(pNode==NULL){
return makeTree(data); 1 7 9 17
} else{
//Recursa hacia abajo del arbol
//Para encontrar el lugar correcto 5
if(data<=pNode->info){
pNode->left = insert(pNode->left, data);
}else{
pNode->right = insert(pNode->right, data);
}
//Retorna el nodo original sin cambiar
return(pNode);
}
}
rbol binarios: Ejercicio simple
Escribe cdigo que implemente el siguiente rbol binario:
a) Llamando a makeTree tres veces
2 y usando tres variables puntero.
TNODEPTR build123(){
TNODEPTR one, two three;
one = makeTree(1);
1 3
two = makeTree(2);
three = makeTree(3);
two->left = one;
two->right = three;
b) Llamando a makeTree tres veces return two
y usando una variable puntero. }
3 D 6 E F 9
ABDGCEHIF
4 G H I
7 8
Recorrido de rboles binarios
Orden Simtrico/Inorden:
1. Recorrer el subrbol izquierdo en orden simtrico
2. Recorrer la raz
3. Recorrer el subrbol derecho en orden simtrico
1 D 6 E F 9
DGBAHEICF
2 G H I
5 7
Recorrido de rboles binarios
Orden Posterior:
1. Recorrer el subrbol izquierdo en orden posterior
2. Recorrer el subrbol derecho en orden posterior
3. Recorrer la raz
2 D 6 E F 7
GDBHIEFCA
1 G H I
4 5
Remocin en un rbol binario ordenado
15 15
3 8 16 8 16
15 15
15
24
Remocin en un rbol binario ordenado
void deleteNode(TNODEPTR tree, int x) 15 15
{
TNODEPTR p = tree, q = NULL, rp;
4 19 4 19
while (p != NULL && p->info != x) {
q = p;
3 8 16 8 16
p = (x < p->info) ? p->left :
p-> right;
15 15
}
if (p == NULL) return;
4 19 8 19
if (p->left == NULL)
rp = p-> right;
8 16 16
else if (p-> right == NULL)
rp = p->left; 15
else { 4 23
19
TNODEPTR f = p;
rp = p-> right; 3 8 16 25
TNODEPTR s = rp->left;
while (s != NULL) {
18 23
24
f = rp;
rp = s; 24
s = rp->left;
rboles Balanceados
La altura (profundidad) de un rbol binario es el nivel
mximo de sus hojas
0
1
0 1 -1
0
0 0 0
0 0 0
0 0
0 0
Por ejemplo:
P = {data=10, left=7, right=15, FE=2}
p
10
7 15
5 8
2 6
rbol AVL: Rotaciones
7
5 10 2,5,6,7,8,10,15
2 6 8 15
10
7 15
2 7
5 8
6 10 2,5,6,7,8,10,15
Recorrido Inorder
8 15 2 6
l r l lr
5 10 5 8
lr r
2 6 8 15
2 6
Rotacin izquierda
p r
Si la insercin se produce en el hijo derecho (lr) del 7 15
12
Rotacin a Rotacin a
la izquierda la derecha 9
9 15
7 12
7 10
5 8 10 15
5 8
2 6
2 6
Casos de Insercin
La insercin funciona como si fuera un rbol de bsqueda
binario desequilibrado, retrocediendo hacia la raz y rotando
sobre cualquier nodo no balanceado.
Nuevo nodo
Nuevo nodo
Solucin: Rotacin Izquierda
X X X
B C D E
6 10 37 60 70 80 100 120 150
F G H
25 62 65 69 110
rboles Multicaminos: Operaciones Bsicas
numTrees(p): Dado un nodo multicamino p, retorna el nmero de hijos
(subrboles) de p (0<=numTrees(p)<=n). Donde n es el orden o grado del rbol.
child(p,i): Retorna el i_simo hijo del nodo p. Donde 0<=i<numTrees(p)-1.
key(p,j): Retorna la j_sima llave del nodo p. Donde 0<=j<numTrees(p)-2 son las
llaves en orden ascendente
numTrees(A) => 4
A key(A,2)
key(A,0)
12 50 85
child(A,0) child(A,3)
B C D E
B C D E
60 70 80 100 120 150
6 10 37
traverse(T node){
if(node != NULL){
nt = numTrees(node); nt = 4
for(i = 0; i<nt-1; i++){ 0<=i<3
traverse(son(node,i));
key(A,0), Key(A,1), Key(A,2)
cout<<key(node, i); A
}
12 50 85
traverse(son(node,nt-1));
}
son(A,0) son(A,1) son(A,2) son(A,3)
}
B C D E
60 70 80 100 120 150
6 10 37
rboles Multicaminos: Operaciones Bsicas
Acceso secuencial directo: Accede a la siguiente llave partiendo de
otra que se le conoce su posicin en el rbol. Asumimos que la llave
que conocemos se encuentra en Key(node, index)