Вы находитесь на странице: 1из 52

Estructura de Datos En C++

Dr. Romeo Snchez Nigenda.


E-mail: romeo.sanchez@gmail.com
http://yalma.fime.uanl.mx/~romeo/
Oficina: 1er. Piso del CIDET. Oficina con Dr. Oscar Chacn
Horas de Tutora: 10am-11am Martes y Jueves,
3:30pm-4:30pm Mircoles, 2:00pm-4:00pm Viernes.

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.

Algorithms. Third Edition.


Parts 1-4, Fundamentals Data Structures Sorting Searching
Robert Sedgewick.

Estructura de Datos.
Romn Martnez, Elda Quiroga.
Thomson Learning.

Cualquier libro de Estructura de Datos!

Software:
Compiladores GCC (GNU Compiler Collection)

IDEs (Integrated Development Environment):


http://www.eclipse.org/downloads/
http://kdevelop.org/
http://www.bloodshed.net/devcpp.html
6. 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
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.

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 camino entre un par de nodos, entonces lo que
tenemos es un Grafo.
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 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.

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

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 de su padre.
Nivel = 0

Nivel = 1
Nivel = 2
Nivel = 3
Profundidad

Nivel = 0 rbol binario completo: Es un rbol


1 binario que tiene todos sus nodos
Nivel = 1 completos en cada subrbol a una
nodos 2
profundidad d.
4 Nivel = 2
d Si un rbol binario contiene m
2l nodos por nivel, por lo tanto la nodos en el nivel l, entonces
Cantidad de nodos en un rbol de contiene un mximo de 2m nodos
Profundidad d es igual a la suma de en el nivel l+1.
Los nodos por nivel:
N = 20 + 21 + + 2d = d 2j = 2d+1 - 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 del
apuntador al padre del nodo nodo, en este ejemplo es a
p
a right(p) : Retorna un apuntador
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) = false isRight(g) = true

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

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

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


lado izquierdo o derecho de algn otro nodo respectivamente, false sino es el caso.
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:

Bool isLeft(p) isLeft(a) ?


q = father(p) a

if(q == null) isLeft(b) ? b c isLeft(c) ?


return false;
d e f g
if(left(q) == p)
return true;
return false; Implementa isRight(p)!
rboles Binarios: Operaciones
brother(p) father
a
if(father(p) == null)
b c brother(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.

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

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

En promedio, un rbol binario ordenado puede localizar un


nodo en un rbol de N nodos en tiempo log(N).
Bsqueda en un rbol binario ordenado 15

//Dado un rbol binario, retorna 4 19


//verdadero si el dato buscado se
//encuentra en el rbol, o falso si no
bool find(TNODEPTR pNode, int data){
//Caso base:arbol vacio 3 8 16
if(pNode==NULL){
return false;
} else{
7 9 17
//Dato es encontrado
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);
}
}
}
}
Insercin en un rbol binario ordenado 15

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

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){
A
recorridoPreorden(pNode->left);
9 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
15 15

Se presentan tres casos:


El nodo a suprimir no tiene hijos: Se elimina el 4 19 4 19

nodo del rbol sin mayores ajustes

3 8 16 8 16

15 15

Si el nodo a suprimir slo tiene un subrbol: Su 4 19 8 19

nico hijo se mueve hacia arriba y ocupa su lugar


8 16 16

15

El nodo a suprimir tiene dos subrboles: Su 4 23


19

sucesor de orden intermedio S (o


antecesor) debe ocupar su lugar. El sucesor
3 8 16 25
intermedio es el nodo hijo ms a la izquierda en
su rbol derecho. Dicho nodo no puede tener
un subrbol izquierdo. El antecesor sera el nodo 18 23
24
hijo ms a la derecha de su rbol izquierdo.

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

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

0
1

0 1 -1
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.

Si el FE>=2, es necesario reequilibrar el rbol.


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

Rotacin derecha Rotacin izquierda


Algoritmo de Rotacin Izquierda
r
q = right(p); 10
p temp = left(q);
left(q) = p; p r
7 right(p) = temp 7 15

l r l lr
5 10 5 8

lr r
2 6 8 15
2 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 hijo
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 12
r

p r
Si la insercin se produce en el hijo derecho (lr) del 7 15

hijo izquierdo (p) del nodo desequilibrado (r) o


viceversa , se realizar una doble rotacin. l lr
5 9

Rotacin Doble a la Derecha: Primero es


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

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

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 llaves

S0 K0 Kj-1 Sj Kj Kn-2 Sn-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 3
A
12 50 85

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

60 70 80 100 120 150


6 10 37
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).

A child(p, numTrees(p)-1) apunta


key(A,0) key(A,2)
child(p,0) apunta a un a un subrbol que contiene
subrbol cuyas llaves son 12 50 85 nicamente llaves mayores a
todas menores que la llave key(p, numTrees(p)-2).
key(p,0).

B C D E
60 70 80 100 120 150
6 10 37

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


llaves de este llaves de este nodo:
nodo {6,10} < 12 {100,120, 150} > 85
rboles Multicaminos: Operaciones Bsicas
Recorrido: Impresin de llaves en orden
ascendente.

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)

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

Вам также может понравиться