Vous êtes sur la page 1sur 55

Introduccin

Qu estructura de datos se debe utilizar


para representar estructuras jerrquicas o
taxonmicas?

Ejemplo:
Director
SubDir1

JDpto1

JDpto2

SubDir2

JDpto3

SubDir3

JDpto4

JDpto5

Definicin de rbol
Un rbol (tree) es un T.D.A. que consta de un
conjunto finito T de nodos y una relacin R
(paternidad) entre los nodos tal que:
Hay un nodo, especialmente designado, llamado la
raz del rbol T.
A

B
D

Definicin de rbol
Los nodos restantes, excluyendo la raz, son
particionados en m (m 0) conjuntos disjuntos T1,
T2, ..., Tm, cada uno de los cuales es, a su vez, un
rbol, llamado subrbol de la raz del rbol T.

A
C

Definicin de rbol
A los nodos que no son races de otros subrboles
se les denomina hojas del rbol T, o sea, no tienen
sucesores o hijos.
A
C

Definicin de rbol
Si n es un nodo y A1, A2, A3, A4, A5, , Ak son
rboles con races n1, n2, n3, n4,, nk . Se puede
construir un nuevo rbol haciendo que n se
constituya en padre de los nodos n1, n2, n3, n4,, nk.

En dicho rbol, n es la raz y A1, A2, A3, A4, A5, , Ak


son los subrboles de la raz.
Los nodos n1, n2, n3, n4,, nk reciben el nombre de
hijos del nodo n.

Aclaraciones
Si el conjunto finito T de nodos del rbol es vaco,
entonces se trata de un rbol vaco.
En esta estructura existe slo un nodo sin padre,
que es la raz del rbol.
Todo nodo, a excepcin del nodo raz, tiene uno y
slo un padre.
Los subrboles de un nodo son llamados hijos.

Ejemplos
A
C

Padre de C:

Padre de E:

Padre de G

Padre de A:

NO

Hijos de A:

Hijos de C:

Hijos de F:

NO

Aclaraciones
Para todo nodo k, distinto de la raz, existe una
nica secuencia de la forma:
k0, k1, k2, k3, ..., kn, donde k0=raz y kn=k
Con n >= 1, donde.
ki es el sucesor de ki-1,
para 1 <= i <= n, o sea, cada nodo ki de la
secuencia es la raz de otro subrbol.

Ejemplos
Secuencias

de A a G
C

B
D

de A a E
G

de A a F
C es sucesor de A y
F es sucesor de C

Otras definiciones
Grado de un nodo: cantidad de hijos de un nodo.
Grado de un rbol al mayor de los grados de todos
sus nodos.
Nodo hoja a un nodo sin hijos o con grado = 0.
Nodo rama a un nodo que tiene hijos, o sea, a la raz
de un subrbol.

Ejemplos
Grado

A
C

B
E

G
K

de A:

de E:

de G:

de J:

Grado del rbol: 3


Nodos hojas: D, H, I, J, F, K
Nodos ramas: A, B, C, E, G

Otras definiciones
Nivel de un nodo al nivel de su padre ms uno. Por
definicin, la raz del rbol tiene nivel 0. Esta
definicin es recursiva.

Ejemplos
A

Nivel

B
D

de A:

de E:

de B:

de I:

de G:

Otras definiciones
rbol completo de nivel n a un rbol en el que
cada nodo de nivel n es una hoja y cada nodo de
nivel menor que n tiene, al menos, un subrbol no
vaco.

Ejemplos
A

rbol completo de nivel 2

rbol no completo de nivel 2

Cada nodo del nivel n es


una hoja

Un nodo del nivel n-1 es una


hoja

Otras definiciones
Padre de un nodo al nodo raz del subrbol ms
pequeo que contiene a dicho nodo y en el cual l
no es raz.

Hijo de un nodo al (los) nodo(s) raz(ces) de uno de


sus subrboles.
Predecesor de un nodo al nodo que le antecede en
un recorrido del rbol.
Hermano de un nodo a otro nodo hijo de su padre.

Ejemplos
A
C

B
D

Padre de G:

Hijos de C: E

Hermanos de I:

Otras definiciones
rbol ordenado a todo rbol para el que se
considera el orden relativo de los sucesores o
subrboles de cualquier nodo. Es decir, en un rbol
ordenado se habla de primero, segundo o ltimo hijo
de un nodo en particular. El primer hijo de un nodo
de un rbol ordenado es denominado el hijo mayor
de ese nodo y el ltimo hijo es denominado el menor.
El rbol es ordenado si al intercambiar el orden
relativo de los subrboles de un nodo, representa
una situacin semnticamente diferente.

Ejemplos: rbol genealgico de Mara


(sin los hermanos)
Mara
Juan

Luisa

Jos Elsa Pedro

Lisa

El rbol es ordenado
El primer subrbol corresponde al padre.

El segundo subrbol a la madre.

Otras definiciones
rbol orientado a un rbol para el cual no interesa
el orden relativo de los sucesores o subrboles de
cualquier nodo, ya que slo se tiene en cuenta la
orientacin de los nodos.
Ejemplo:
La estructura organizativa de una empresa, donde
no es importante el orden de los subdirectores a la
hora de representarlos en el rbol.

En la solucin de problemas informticos, los ms


utilizados son los rboles ordenados.

Otras definiciones
Una floresta es una coleccin de dos o ms rboles
disjuntos.
Aclaraciones:
Disjuntos significa que no hay nodos en comn
entre dos rboles cualesquiera de la misma.
De un rbol se obtiene una floresta al quitarle la
raz, si tiene dos hijos o ms.
De una floresta se obtiene un rbol al aadir un
nodo que sea raz de todos los rboles que la
conforman.

Ejemplos
A
B
D

Es
Es un
unarbol
floresta

NO es una floresta

Definicin de rbol Binario


Un rbol binario (en ingls binary tree) es un rbol
ordenado de, a lo sumo, grado 2.
Aclaraciones:
A lo sumo grado 2 significa que cada nodo tiene
como mximo dos hijos, o sea, dos subrboles.
Al ser ordenado el rbol, importa el orden de los
subrboles, es decir, que ser necesario especificar
de cada nodo cul es el hijo izquierdo y cul el hijo
derecho.

Ejemplo
Mara
Juan

Luisa

Jos Elsa Pedro

Lisa

El rbol genealgico es un rbol binario.


Cada nodo tiene dos hijos

Es significativo el orden de los subrboles.

rbol Binario: Caractersticas


Cada nodo del rbol binario contiene:
Una referencia a su informacin.
Un apuntador a su hijo izquierdo.
Un apuntador a su hijo derecho.
Informacin

Hijo Izquierdo

Hijo Derecho

Recorridos de un rbol Binario


Los recorridos se clasifican de acuerdo al momento
en que se visita la raz del rbol y los subrboles
izquierdo y derecho.
Existen tres recorridos:
Recorrido en Preorden
Recorrido en orden simtrico o inorden
Recorrido en orden final o Postorden

Recorrido en Preorden
1. Visitar la raz.
2. Recorrer subrbol izquierdo en preorden.

3. Recorrer subrbol derecho en preorden.

Recorrido en Preorden
A
C

B
D

Recorrido: A B D E C F G
1. Raz.
2. Subrbol izquierdo en preorden.
3. Subrbol derecho en preorden.

Recorrido en Simtrico
1. Recorrer subrbol izquierdo en simtrico.
2. Visitar la raz.

3. Recorrer subrbol derecho en simtrico.

Recorrido en Simtrico
A
C

B
D

Recorrido D B E A F C G
1. Subrbol izquierdo en simtrico.
2. Raz.
3. Subrbol derecho en simtrico.

Recorrido en Postorden
1. Recorrer subrbol izquierdo en orden final.

2. Recorrer subrbol derecho en orden final.


3. Visitar la raz.

Recorrido en Postorden
A
C

B
D

Recorrido D E B F G C A
1. Subrbol izquierdo en orden final.
2. Subrbol derecho en orden final.
3. Raz.

rbol Binario: Implementacin en C++


class TBinTreeNode
{
protected:
void* aInfo;
TBinTreeNode* aLeft;
TBinTreeNode* aRight;
TBinTreeNode* Left() {return aLeft;}
void Left(TBinTreeNode* pNode) {aLeft = pNode;}
TBinTreeNode* Right() {return aRight;}
void Right(TBinTreeNode* pNode) {aRight = pNode;}
public:
TBinTreeNode(void* pInfo) : aInfo(pInfo), aLeft(NULL), aRight(NULL) {}
virtual int Degree();
void* Info() {return aInfo;}
virtual bool IsLeaf() {return (!aLeft && !aRight);} // Degree() == 0
};

rbol: Implementacin en C++


class TBinTree {
protected:
TBinTreeNode* aRoot;
public:
TBinTree() {aRoot = NULL;}
~TBinTree();
virtual void* DeleteNode(TBinTreeNode*);
bool DivideTree(TBinTreeNode*, TBinTree* &, TBinTree* &);
bool Empty(){return !aRoot;}
TBinTreeNode* GetFather(TBinTreeNode*);
virtual TGLinkedList* GetLeaves();
virtual bool InsertNode(TBinTreeNode*, char, TBinTreeNode*);
int NodeLevel(TBinTreeNode*);
TBinTreeNode* Root() {return aRoot;}
void Root(TBinTreeNode* pRoot) {aRoot = pRoot;}
int TreeDegree();
int TreeLevel();
};

rboles Generales
Director
SubDir1

JDpto1

JDpto2

SubDir2

JDpto3

SubDir3

JDpto4

JDpto5

La estructura anterior se puede


representar con un rbol binario?

rboles Generales
Son rboles cuyo grado es mayor que dos.

Cmo representarlos?

rboles Generales
1

Por cada nodo: la informacin y una lista de


referencias a cada uno de sus hijos.

Secuencial: Se pierde espacio, cada nodo tiene


un agrado diferente.

Enlazada: la manipulacin de la lista de hijos se


hace difcil.

rbol General: Implementacin en C++


class TGBinTreeNode: public TBinTreeNode
{
public:
TGBinTreeNode(void* pInfo): TBinTreeNode(pInfo) {}
bool IsLeaf() {return !aLeft;}
int Degree();
};

rbol General: Implementacin en C++


int TGBinTreeNode::Degree()
{
int degree = 0;
TBinTreeNode* cursor = Left();
while (cursor)
{
degree++;
cursor = cursor->Right();
}
return degree;
}

rbol General: Implementacin en C++


class TGBinTree: public TBinTree
{
public:
void* DeleteNode(TGBinTreeNode*);
TGBinTreeNode* GetFather(TGBinTreeNode*);
TGLinkedList* GetLeaves();
TGLinkedList* GetSons(TBinTreeNode*);
bool InsertNode(TGBinTreeNode*, TGBinTreeNode*);
};

Colocacin Secuencial de rboles


?

1 Se puede colocar secuencialmente un rbol?


Si

2 Cundo colocar secuencialmente un rbol?


Cuando debe recorrerse en mltiples ocasiones y
no sufre frecuentes inserciones y/o eliminaciones.
Ejemplo: una frmula que debe ser evaluada
muchas veces.

Colocacin Secuencial de rboles


?

3 Cmo colocar secuencialmente un rbol?

Los mtodos ms conocidos son:

Almacenamiento en Preorden Secuencial.


Almacenamiento en Orden Familiar.
Almacenamiento en Postorden Secuencial.

Colocacin en Preorden Secuencial


1. Se transforma a binario
2. Los nodos deben colocarse secuencialmente
recorriendo al rbol en preorden.
3. Por cada nodo se registra tres campos:

INFO
ENLDER

TERM

rbol binario recorrido en Preorden


Siguiente hermano en el rbol general,
hijo derecho en el binario.
Convencin: -1 si no existe
Indica si el nodo es terminal (no tienen hijo
en el general) y no tiene hijo izquierdo (en
el binario).

Colocacin en Preorden Secuencial


A

A
C

E
E

J
F

G
H

I
3 -1

6 -1 -1

INFO

A B E F

C G D

TERM

ENLDER -1

4
F

8
H

9 -1
I J

T T

Colocacin en Preorden Secuencial


Aclaraciones:
Los hermanos se obtienen a travs del enlace
derecho.

Si un nodo no es terminal la siguiente posicin de la


lista secuencial est ocupada por su hijo. De lo
contrario, es familia de otro nodo (hermano o hijo).
Los subrboles estn juntos, primero el padre y
luego los hijos.

Implementacin en C++
typedef int TIndex;
class TPreOrderNode
{
private:
void* aInfo;
TIndex aRightLink;
bool aEnd;
public:
TPreOrderNode(void* pInfo, bool pEnd) : aInfo(pInfo), aRightLink (-1),
aEnd(pEnd){}
void* Info() {return aInfo;}
TIndex RightLink () {return aRightLink;}
void RightLink(TIndex pRightLink) {aRightLink = pRightLink;}
bool End() {return aEnd;}
};

Colocacin en Orden Familiar


1. Se transforma a binario
2. Los nodos deben colocarse secuencialmente
recorriendo al rbol en postorden invertido.
3. Por cada nodo se registra tres campos:

INFO
rbol binario recorrido en Postorden invertido
ENLIZQ primer hijo en el rbol general e hijo
izquierdo en el binario.
Convencin: -1 si no existe
FAM
Indica ltimo hermano en el rbol general y
enlace derecho en NULL en el binario. Indica
el nodo final de cada familia

Colocacin en Orden Familiar


A

A
C

E
E

J
F

G
H

I
1

INFO

4 -1 -1 -1 -1 -1 -1
A B C D H I J G E F

FAM

ENLIZQ

T F

Colocacin en Orden Familiar


Aclaraciones:
El nodo raz (si no es una floresta) y los nodos
que no tienen un siguiente hermano se tienen
FAM en T (True).
El que sigue a un nodo es su hermano si FAM es
F (False).
Los hermanos estn juntos secuencialmente.
El enlace izquierdo indica el subndice del
primer hijo y los otros a continuacin son los
hermanos hasta que FAM tome valor True.

Implementacin en C++
class TFamilyNode
{
private:
void* aInfo;
TIndex aLeftLink;
bool aFamily;
public:
TFamilyNode(void* pInfo, bool pFamily) : aInfo(pInfo), aLeftLink(-1),
aFamily(pFamily){}
void* Info() {return aInfo;}
TIndex LeftLink () {return aLeftLink;}
void LeftLink (TIndex pLeftLink) {aLeftLink = pLeftLink;}
bool Family() {return aFamily;}
};

Colocacin en Postorden Secuencial


1. Se transforma a binario.
2. Los nodos deben colocarse secuencialmente
recorriendo al rbol en simtrico.
3. Por cada nodo se registra dos campos:

INFO
GRADO

rbol binario recorrido en Simtrico


Grado del nodo

Colocacin en Postorden Secuencial


A

A
C

E
E

J
F

G
H

I
GRADO
TERM

E F

B G C H

D A

Colocacin en Postorden Secuencial


Aclaraciones:
Cada padre del rbol general est precedido de
sus hijos, por tanto, es fcil encontrar el subrbol
izquierdo de cada nodo del rbol binario. Se
puede encontrar si recorremos la representacin
secuencial comenzando por el ltimo elemento
teniendo en cuenta el grado.
Notar que si despus de un padre aparece un
nodo sin hijos el padre del primero se busca al
final.
Ejemplo: el padre de C se busca al final.

Implementacin en C++
class TPostOrderNode
{
private:
void* aInfo;
int aDegree;
public:
TPostOrderNode(void* pInfo, int pDegree) : aInfo(pInfo),
aDegree(pDegree){}
void* Info() {return aInfo;}
int Degree() {return aDegree;}
};

Documento tomado de Zamantha Gonzlez Daz


Compilado por Sullin Santaella, con fines acadmicos

Vous aimerez peut-être aussi