You are on page 1of 51

ALGORITMOS ARBOLES BST

MsC. Yamil Cardenas M


rboles
Objetivo:El alumno entender y aprender las
estructuras de datos no lineales y dinmicas
ms importantes en computacin.

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.

Podemos concluir que un rbol es entonces una estructura de


datos que mantiene un conjunto de nodos conectados
(imitando la forma de un rbol).

Encontramos muchos ejemplos de rboles en nuestra vida


diaria:
Organizacin de torneos deportivos
rboles familiares (ascendientes y descendientes)
Organigramas de corporaciones
Procesamiento de lenguaje natural
Organizacin de sistemas de archivos (directorios y archivos)
rboles
Existen diferentes tipos de rboles:
rboles en general
rboles binarios (AVL, Rojo-Negro, AA)
rboles balanceados
rboles multi-caminos (B, B+, B*)

En general un rbol es un conjunto de vrtices y aristas


que satisfacen ciertos requisitos.
Un vrtice es un objeto simple, tambin denominado nodo, que
contiene informacin.
Una arista (o arco) es una conexin entre dos vrtices
Un camino (o ruta) en un rbol es una lista de vrtices distintos, en los
que cada uno de ellos se encuentran conectados sucesivamente por
aristas en el rbol.

La propiedad definitoria de un rbol es que existe


solamente un camino o ruta conectando un par de nodos.
Si hay ms de un camino entre dos nodos, o si no hay un
rboles: Terminologa
Un nodo por lo tanto, es la unidad sobre la que se
construye el rbol, y puede tener cero o ms nodos hijos
conectados a l (por medio de aristas) esta propiedad se le
denomina grado.

Se dice que un nodo a es padre de un nodo b (o b es hijo


de a) si existe un enlace desde a hasta b.

Un rbol solo puede tener un nico nodo sin padres, al


cual se le denomina raz. En un rbol con raz, cualquier
nodo es la raz de un subrbol, el cual consiste de s mismo
y de los nodos descendientes de l

Un nodo que no tiene hijos se le denomina hoja o


terminal.

El resto de los nodos se les conoce como rama, ya que


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.

Las aristas en un rbol no tienen direccin, usualmente se


menciona que se encuentran apuntando hacia la raz o
fuera de ella. Y usualmente se coloca a la raz en la cima
del rbol.

Un rbol ordenado es un rbol con raz en el cual el


orden de los nodos descendientes (hijos) sigue un patrn
determinado

Si cada nodo debe tener un nmero determinado de hijos


en un orden especfico, entonces tenemos un rbol de M-
aristas. El rbol de M-aristas ms simple es el rbol
rboles: Definicin
General
Caso base: Un rbol con un solo nodo, el cual es a la vez la
raz del rbol y una hoja.

Un rbol a partir de un nodo raz R y k rboles A1, A2, A3,


, Ak con races n1, n2, n3, , nk respectivamente, y N1, N2,
N3,, Nk nodos cada uno.

El rbol resultante de N = 1 + N1 + N2 + N3 ++Nk nodos


tiene como raz al nodo R, por lo que los nodos n1, n2, n3,
, nk son los hijos de R.

A cada uno de los rboles Ai se les denota como


subrboles de la raz.

Un recorrido es una sucesin de nodos del rbol de tal


rboles: Definicin
General
Existen dos recorridos tpicos para listar los nodos de un
rbol: en profundidad y en anchura.

En profundidad (depth-first) listamos los nodos


expandiendo primero el hijo actual de cada nodo hasta
llegar a una hoja, al llegar a una hoja regresamos al nodo
anterior probando el siguiente hijo, y as sucesivamente.

En anchura (breadth-first), antes de recorrer los nodos


del nivel d+1 (profundidad de d+1 aristas desde la raz),
se listan todos los nodos del nivel d.
rboles: Ejemplos
rboles Binarios
Un rbol binario es un conjunto finito de elementos que
est vaco o dividido en tres subconjuntos:
1. El primer subconjunto contiene un elemento nico, la raz del rbol,
2. Un subrbol binario izquierdo que puede o no estar vaco
3. Un subrbol binario derecho equivalente al izquierdo

En otras palabras, un rbol binario es un nodo externo, o


un nodo interno conectado a un par de rboles binarios, los
subrboles izquierdo y derecho. raz
ancestro
izq der

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

Nivel = 0 rbol binario completo: Es un


1 rbol binario que tiene todos
Nivel = 1 sus nodos completos en cada
nodos 2
subrbol a una profundidad
4 Nivel = 2 d.
d
2l nodos por nivel, por lo tanto la Si un rbol binario contiene
Cantidad de nodos en un rbol de m nodos en el nivel l,
Profundidad d es igual a la suma de entonces contiene un
Los nodos por nivel: mximo de 2m nodos en el
N = 20 + 21 + + 2d = d 2j = 2d+1 - 1 nivel l+1.
j=0
rboles Binarios:
Operaciones
Entre las aplicaciones ms comunes tenemos:

Dado un apuntador p a un nodo en un rbol binario

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

brother(p) : Retorna un apuntador al hermano del nodo.

Note que si no existe un nodo que satisfaga cualquiera de las funciones anterio
retorna un nulo (null) entonces.

Las funciones lgicas isLeft(p) y isRight(p) retornan true si p se encuentra e


lado izquierdo o derecho de algn otro nodo respectivamente, false sino es el
rboles Binarios:
Operaciones
Las funciones isLeft(p), isRight(p), y
brother(p), se implementan usando la
funcionalidad de left(p), right(p), y
father(p). Ejemplo:

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;
}

TNODEPTR leftChild(TNODEPTR pNode)


{
return pNode->left;
}

TNODEPTR rightChild(TNODEPTR pNode)


{
return pNode->right;
}
Representacin bsica de un rbol binario
void setLeftChild(TNODEPTR pNode, int x) {
if (pNode == NULL)
cout << "Error, padre es nulo!" << endl;
else if (leftChild(pNode) != NULL)
cout << "Error, hijo izquierdo presente!; else {
pNode ->left = makeTree(x);
pNode ->left ->father = pNode;
}
}

pNode pNode pNode


Y N N N X N N N Y N N Y N N

makeTree(x);

X N N N X N N

pNode->left=

pNode ->left ->father = pNode;

void setRightChild(TNODEPTR pNode, int x){} //Es similar


Representacin bsica de un rbol binario

bool isLeft(TNODEPTR pNode) {


if (pNode == NULL)
return false;
else if (father(pNode) == NULL)
return false;
else
return (leftChild(father(pNode)) == pNode);
}

bool isRight(TNODEPTR pNode) {


if (pNode == NULL)
return false;
else if (father(pNode) == NULL)
return false;
return (rightChild(father(pNode)) == pNode);
}
Representacin bsica de un rbol binario

TNODEPTR sibling(TNODEPTR pNode) {


if (pNode == NULL)
return NULL;
if (father(pNode) == NULL)
return NULL;
if (isLeft(pNode))
return rightChild(father(pNode));
else
return leftChild(father(pNode));
}

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

Estetipo 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.

En promedio, un rbol binario ordenado puede


localizar un nodo en un rbol de N nodos en
tiempo log(N).
1
Bsqueda en un rbol binario ordenado 5

//Dado un rbol binario, retorna 1


4 9
//verdadero si el dato buscado se
//encuentra en el rbol, o falso si no
bool find(TNODEPTR pNode, int data){
1
//Caso base:arbol vacio 3 8 6
if(pNode==NULL){
return false;
} else{ 1
7 9
//Dato es encontrado 7
if(pNode->info==data){
return true;
}else{ 5
if(data<pNode->info){
//Recursa a la izq si es menor
return find(pNode->left,data);
} else{
//Recursa a la derecha si es mayor
return find(pNode->right,data);
}
}
}
}
1
Insercin en un rbol binario ordenado 5

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. }

TNODEPTR build123(){ b) Llamando a insert tres veces,


TNODEPTR two;
two = makeTree(2); pasndole la raz del rbol.
two->left = makeTree(1);
TNODEPTR build123(){
two->right = makeTree(3);
TNODEPTR root=NULL;
return two
root = insert(root,2);
}
root = insert(root,1);
root = insert(root,3);
return root;
}
rbol binarios: Ejercicio
simple
Implementa la funcin size que calcula el
nmero de nodos en un rbol binario.
int size(TNODEPTR pNode){
if(pNode==NULL){
return 0;
}else{
return (size(pNode->left)+
1 +
size(pNode->right));
}
}
Dado un rbol binario ordenado no nulo, implementa
una funcin que retorne el valor mnimo en el rbol

int minimum(TNODEPTR pNode){


TNODEPTR current = pNode;
while(current->left!=NULL)
current = current->left
}
return current->info;
}
Recorrido de rboles
binarios
Recorrer un rbol binario significa visitar la raz y recorrer

sus subrboles izquierdo y derecho de forma recursiva.
Orden previo:
1. Visitar la raz
2. Recorrer el subrbol izquierdo en orden previo
3. Recorrer el subrbol derecho en orden previo
void recorridoPreorden(TNODEPTR pNode){
1 A if(pNode!=NULL){
cout<<"Node: "<<pNode->info;
recorridoPreorden(pNode->left);
B C recorridoPreorden(pNode->right);
2 5 }
}

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

void recorridoInorden(TNODEPTR pNode){


if(pNode!=NULL){
recorridoPreorden(pNode->left);
4 A cout<<"Node: "<<pNode->info;
recorridoPreorden(pNode->right);
}
}
3 B 8 C

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

void recorridoPostorden(TNODEPTR pNode){


if(pNode!=NULL){
recorridoPreorden(pNode->left);
9 A
recorridoPreorden(pNode->right);
cout<<"Node: "<<pNode->info;
}
3 B 8 C }

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

Si el nodo a suprimir slo tiene un subrbol: 4


4
1
1 8
8
1
1
9
9 9
9
Su nico hijo se mueve hacia arriba y ocupa
su lugar
1
1 1
1
8
8 6
6 6
6

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

Un rbol binario balanceado o rbol AVL es aquel


en el que las alturas de los dos subrboles de cada
nodo nunca difieren en ms de 1.

El balance de un nodo en un rbol binario se define


como la altura de su subrbol izquierdo menos la
altura de su subrbol derecho.

Por lo tanto, cada nodo en un rbol AVL tiene un


balance de 1, -1 o 0, dependiendo de si la altura de
su subrbol izquierdo es mayor que, menor que o
igual a la altura del derecho.
rboles Balanceados
-1
-1

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

Factor de Equilibrio (FE): Cada nodo en un rbol AVL tiene un


balance de 1, -1 o 0, dependiendo de si la altura de su subrbol
izquierdo es mayor que, menor que o igual a la altura del
derecho.
rbol AVL
Debido a que los rboles estn balanceados, la
complejidad de bsqueda de un elemento es del
orden O(log n).

Las operaciones en un rbol AVL balanceado son


las mismas que en un rbol binario de bsqueda
desequilibrado, pero si al insertar o borrar
elementos el rbol pierde su balance entonces se
rotan los nodos para equilibrar de nuevo el rbol.

El propsito de la rotacin es que el recorrido de


orden intermedio del rbol rotado sea el mismo
que para el rbol original (es decir, el rbol rotado
sigue siendo un rbol de bsqueda binaria).
rbol AVL: Representacin
Cada nodo debe contener, adems de los datos, su factor
de equilibrio y los punteros hacia sus hijos.

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

Rotacin derecha Rotacin izquierda


Algoritmo de Rotacin
Izquierda
r
q = right(p); 1
1
0
0
p temp = left(q);
left(q) = p; p r
1
1
7
7
right(p) = temp 7
7 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

Dado un rbol de raz p, y de hijo izquierdo l y derecho r, se forma un nuevo


rbol cuya raz sea la raz del hijo del lado derecho (es decir r), y como su hi
derecho le colocamos el hijo derecho que tena anteriormente (es decir r).

Del lado izquierdo de la nueva raz r, colocamos a la raz anterior p, teniendo


como raz de su subrbol derecho el hijo izquierdo lr de la nueva raz r.
Rotaciones Dobles 1
1
2
2
r

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

Rotacin Doble a la Derecha: Primero es


una rotacin simple a la izquierda, y luego
1
1
rotacin simple a la derecha. 2
2 6
6 8
8 0
0

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

Caso 1: Izquierda Solucin: Rotacin Derecha

* Imgenes tomadas de Wikimedia bajo licencia de documentacin libre GNU


Casos de Insercin
Caso 2: Derecha

Nuevo nodo
Solucin: Rotacin Izquierda

* Imgenes tomadas de Wikimedia bajo licencia de documentacin libre GNU


Casos de Insercin
Caso 3: Izquierda-Derecha Solucin: Rotacin doble

Rotacin Izquierda Rotacin Derecha

* Imgenes tomadas de Wikimedia bajo licencia de documentacin libre GNU


Casos de Insercin
Caso 4: Derecha-Izquierda Solucin: Rotacin doble

Rotacin Derecha Rotacin Izquierda

* Imgenes tomadas de Wikimedia bajo licencia de documentacin libre GNU


rboles Multicaminos
Un rbol multi-camino o multi-direccional de
orden n, es un rbol general en el cual cada
nodo tiene n o menos subrboles, y contiene
una llave (key) menos que subrboles.
Sea A un rbol de n-caminos si y solo si:
I. A est vaco
II. A puede tener hasta n subrboles S0, S1, S2, , Sn-1
en cada nodo
III. Dado n subrboles para un nodo p de A; p tiene Kn-2
llaves en orden. Es decir, cada nodo contiene una
llave menos que subrboles
IV. Todas las llaves en el subrbol S0 son menores que o
iguales a K0, mientras todas las llaves en los
subrboles Sj (1<j<n-2) son mayores que Kj-1.
V. Todas las llaves en el subrbol Sn-1 son mayores que
las llaves kn-2.
rboles Multicaminos: Nodos
Nodo A
Cantidad variable de apuntadores Cantidad variable de llave

Kn- Sn-
S0 K0 Kj-1 Sj Kj
2 1

X X X

X < K0 Kj-1 < X < Kj X > Kn-2


rboles Multicaminos:
Ejemplos
rbol multicamino de orden 4.
Mxima cantidad de llaves es
A
12 50
85

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

child(A,0): child(A,3): Las


Las llaves de este
llaves de nodo:
rboles Multicaminos: Operaciones
Bsicas
Recorrido: Impresin de llaves en orden
ascendente.

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)

next(T node, int index){ succesor(T node, int index){


p = son(node, index+1); p = son(node, index+1);
q = null; if(p!=NULL &&
while(p != NULL){ index<numTrees(node)-2)
q = p; return (next(p,index));
p = son(p,0); f = father(node);
} i = index(node);
if (q!=NULL) while(f != NULL&&
return key(q,0); i==numTrees(f) -1){
if(index < numTrees(node)-2) i = index(f);
return key(node, index+1); f = father(f);
return (NULL); }
} if (f==NULL)
return (NULL);
return (key(f,i));
}