Beruflich Dokumente
Kultur Dokumente
Temario:
rboles en general
rboles binarios
rboles balanceados
rboles multicaminos
rboles
EnInformtica, 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.
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 Nivel
de su=padre.
0
Nivel = 1
Nivel = 2
Nivel = 3
Profundidad
Null
father(p) : Retorna un info(p) : Retorna el contenido de
apuntador al padre del nodo nodo, en este ejemplo es a
p
a right(p) : Retorna un apuntad
left(p) : Retorna un apuntador
al hijo izquierdo del nodo b al hijo derecho del nodo
c
d e f g
isLeft(d) = true
isLeft(e) = falseisRight(g) = true
Note que si no existe un nodo que satisfaga cualquiera de las funciones anterio
retorna un nulo (null) entonces.
isLeft(a) ?
Bool isLeft(p)
a
q = father(p)
isLeft(b) ? b c isLeft(c) ?
if(q == null)
return false; d e f g
if(left(q) == p)
return true;
Implementa isRight(p)!
return false;
rboles Binarios:
Operaciones
brother(p) father
a
if(father(p) == null)
b cbrother(c) ?
return null;
if(isLeft(p)) d e f g
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.
1 1 1 1 1
5 5 5 5 5
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}
1 1 1
5 5 5
1 1 1
4 4 4
9 9 9
1
3 8 3 8 3 8
6
7 1
7 7 9
7
5 5
rboles Binarios: Aplicacin de Ejemplo
Pseudocdigo:
1
int numbers[13] = {15,4,8, 7, 4, 3, 19, 5, 5
7, 9, 16, 5,17};
tree = makeTree(numbers[0]); 1
4
for(int i=1;i<length(numbers);i++){ 9
p = q = tree;
while(numbers[i] !=info(p) && q!
1
=NULL){ 3 8
6
p = q;
if(numbers[i]<info(p))
1
q = left(p); 7 9 7
else
q = right(p);
} 5
if(numbers[i] == info(p))
cout<<Numero repetido;
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;
Inf L F R
struct tnode * right;
o
};
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;
}
makeTree(x);
X N N N X N N
pNode->left=
father
a
b csibling(c) ?
d e f g
rbol binario de bsqueda u
ordenado
Elejemplo anterior introdujo el rbol binario de
bsqueda o rbol binario ordenado
1
4 9
//Dado un rbol binario, inserta un
//nuevo nodo en el lugar correcto del arbol.
TNODEPTR insert(TNODEPTR pNode, int data){ 1
3 8 6
//1: Si el arbol esta vacio retorna
//un nodo unico
if(pNode==NULL){ 1
return makeTree(data); 1 7 9
7
} 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
1
1 1
1
5
5 5
5
Se presentan tres casos:
El nodo a suprimir no tiene hijos: Se elimina el 4
4
1
1 4
4
1
1
9
9 9
9
nodo del rbol sin mayores ajustes
1
1 1
1
3
3 8
8 8
8
6
6 6
6
1
1 1
1
5
5 5
5
1
1
5
5
2
21
1
4
4
El nodo a suprimir tiene dos subrboles: Su 3
39
9
sucesor de orden intermedio S (o
antecesor) debe ocupar su lugar. El sucesor 3 8
1
1 2
2
3 8 6
intermedio es el nodo hijo ms a la izquierda 6 5
5
en su rbol derecho. Dicho nodo no puede
tener un subrbol izquierdo. El antecesor sera 1
1 2
2
el nodo hijo ms a la derecha de su rbol 8
8 3
4
3
4
izquierdo.
2
2
4
4
Remocin en un rbol binario ordenado
void deleteNode(TNODEPTR tree, int x) 1
1 1
1
5
5 5
5
{
TNODEPTR p = tree, q = NULL, rp; 1
1 1
1
4
4 4
4
9
9 9
9
while (p != NULL && p->info != x) {
q = p; 1 1
3 8 1 8 1
3 8 6 8 6
p = (x < p->info) ? p->left : 6 6
p-> right; 1
1 1
1
5
5 5
5
}
if (p == NULL) return; 1
1 1
1
4
4 8
8
9
9 9
9
if (p->left == NULL)
rp = p-> right; 1 1
8 1 1
8 6 6
6 6
else if (p-> right == NULL)
1
1
rp = p->left; 5
5
else { 4
2
21
1
4 3
39
9
TNODEPTR f = p;
rp = p-> right; 3
3 8
8
1
1 2
2
6
6 5
5
TNODEPTR s = rp->left;
while (s != NULL) { 1
1 2
2
8
8 3
4
3
4
f = rp;
rp = s; 2
2
4
4
rboles Balanceados
La altura (profundidad) de un rbol binario es el
nivel mximo de sus hojas
0
0
1
1
0 1 -1
-1
0 0 1
0
0 0
0 0
0
0
0 0
0 0
0 0
0
0 0
0
0
0 0
0
Por ejemplo:
P = {data=10, left=7, right=15, FE=2}
p
1
1
0
0
1
1
7
7 5
5
5
5 8
8
2
2 6
6
rbol AVL: Rotaciones
7
7
5
5
1
1 2,5,6,7,8,10,15
0
0
1
1
2
2 6
6 8
8 5
5
1
1
0
0
5
5
1
1
7
7 5
5
2
2 7
7
5
5 8
8
6
6
1
1
0
2,5,6,7,8,10,15
0
Recorrido Inorder
1
1
8
8 2
2 6
6
5
5
l r l
1
1
lr
5
5 5
5 8
8
0
0
lr r
1
1
2
2 6
6 8
8 5
5
2
2 6
6
Rotacin izquierda
p r
Si la insercin se produce en el hijo derecho (lr) del 7
7
1
1
5
5
hijo izquierdo (p) del nodo desequilibrado (r) o
viceversa , se realizar una doble rotacin. l lr
5
5 9
9
1
1
2
2
Rotacin a Rotacin a
la izquierda 1
1 la derecha 9
9
9
9 5
5
1
1
7
7
1
1 2
2
7
7 0
0
8 1
1 1
1
5
5 8
5
5 8
8 0
0 5
5
2
2 6
6
2
2 6
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
Kn- Sn-
S0 K0 Kj-1 Sj Kj
2 1
X X X
B C D E
60 70 100 120
6 10 37 80 150
F G H
62 65 11
25
69 0
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
60 70 100 120
6 10 37 80 150
rboles Multicaminos: Operaciones
Bsicas
child(p,i) para
1<=i<=numTrees(p)-2,
contiene todas las llaves
en el rbol entre key(p, i-
1) y key(p,i).
key(A,0) A child(p, numTrees(p)-1)
key(A,2)
child(p,0) apunta a un apunta a un subrbol
12 50
subrbol cuyas llaves 85 que contiene
son todas menores que nicamente llaves
la llave key(p,0). mayores a key(p,
numTrees(p)-2).
B C D E
60 70 100 120
6 3
80 150
10 7
traverse(T node){
if(node != NULL){
nt = 4
nt = numTrees(node);
0<=i<3
for(i = 0; i<nt-1; i++){
traverse(son(node,i)); key(A,0), Key(A,1), Key(A,2
A
cout<<key(node, i);
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 100 120
6 3
80 150
10 7
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)