Anda di halaman 1dari 77

Asignatura: Estructura de Datos Tema: rboles

Tema : rboles
Contenido Definicin de rbol rboles Binarios Recorridos en rboles binarios rboles de bsqueda: rboles lexicogrficos rboles hilvanados Implementacin en un lenguaje de programacin

Tema : rboles
Contenido rboles generales Transformacin de rboles generales en binarios Implementacin en un lenguaje de programacin Colocacin secuencial de rboles

Bibliografa
Data Structures / Algorithms in Java. Robert Lafore. Pginas: 280-370

Thinking in Java. Pginas: 395-445. Aprenda Java como si estuviera en primero. Pginas: 135-139. Aprenda Java en 21 das. Pginas: 135-151. El C++. Lenguaje de Programacin. Bjarne Stroustrup. Pginas 143-180 :.

Objetivos
Conozcan las estructuras de datos arbreas y las formas de trabajar con ellas en la solucin de problemas de mediana complejidad

Introduccin
Estructuras de datos estudiadas: Listas lineales y sus variantes. Las relaciones entre los nodos de informacin son lineales. Todos los nodos tienen un nico antecesor, excepto el primero que no tiene antecesor. Todos los nodos tienen un nico sucesor, excepto el ltimo que no tiene sucesor.

Introduccin
?

Qu estructura de datos se debe utilizar para representar estructuras jerrquicas o taxonmicas?

Ejemplo:
Director SubDir1 SubDir2 SubDir3

JDpto1

JDpto2

JDpto3

JDpto4

JDpto5

Definicin de rbol
Un rbol (tree) es un T.D.A. que consta de un A conjunto finito T de nodos y una relacin R (paternidad) entre los nodos tal que: C B

Hay un nodo, especialmente designado, llamado la A raz del rbol T. G E F D Los nodos restantes, excluyendo A raz, son la C B particionados en m (m 0) conjuntos disjuntos T1, T2, C B ..., Tm, cada uno de los cuales es, a su vez, un rbol, G E llamado subrbol de la raz del rbol T. F D G A los nodos que no son D races E otros subrboles de F se les denomina hojas del rbol T, o sea, no tienen sucesores o hijos.

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 B D E F C G Padre de C: A B C

Padre de E:
Padre de G Padre de A: Hijos de A: Hijos de C: Hijos de F:

NO
B F NO C G

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
A B C E F G Secuencias

de A a G
de A a E 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
A B D H E I F J C

Grado
de A: de E: de G: de J: 2 3 1 0

G
K

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 B D E F I C G

Nivel
de A: de E: de B: de I:

0
2 1 3 2

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

C
E

B G D E

rbol completo de nivel 2


Cada nodo del nivel n es una hoja

rbol no completo de nivel 2 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 B C E Padre de G: C F H G

Hijos de C: E
G 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
Lisa

Jos Elsa Pedro 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 C E B G D E

B
F G

Es un rbol Es una 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 Lisa

Jos Elsa Pedro

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 B D E F C G

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 B D E F C G

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 Simtrico
A B D E F C G

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 de Bsqueda
Permiten realizar operaciones (recorridos, bsqueda de un elemento, etc) de forma ms eficiente. Hay dos momentos para la manipulacin de un rbol: La construccin del rbol. El recorrido del rbol para realizar las operaciones requeridas segn el problema a resolver. Existen dos tipos especiales de rboles: rboles lexicogrficos. rboles hilvanados.

rboles Lexicogrficos
Un rbol lexicogrfico es un rbol binario que, recorrido en orden simtrico, permite obtener la informacin de los nodos en algn criterio de ordenamiento.

La tcnica de construccin de un rbol lexicogrfico consiste en un proceso recursivo que va colocando los nodos en el subrbol izquierdo o derecho del nodo raz, segn sea el criterio de ordenamiento deseado (ascendente o descendente).

rboles Lexicogrficos
Siguiendo un ordenamiento ascendente: 1. Se compara el nodo que se quiere insertar con la raz del rbol.

Si es menor, se coloca en el subrbol izquierdo siguiendo el mismo proceso.


Si es mayor, se coloca en el subrbol derecho siguiendo el mismo proceso.

rboles Lexicogrficos: Ejemplo


rbol lexicogrfico con ordenamiento ascendente. Lista: 2, 7, 1, 4, 5 Lista: 4, 7, 2, 1, 5 2 1 4 7 1 2 4 7

5
Si se recorre en orden simtrico, se obtiene la informacin de sus nodos en orden ascendente: 1, 2, 4, 5, 7 con independencia del orden de la lista original.

Problemas
El recorrido de rboles con programas recursivos resulta costoso ya que implica un gasto adicional de memoria y tiempo de ejecucin. Para rboles muy grandes se puede desbordar el stack del sistema relativamente pronto.
?

Cul es la solucin?

rboles hilvanados

rboles Hilvanados
Un rbol hilvanado (o rbol entrelazado) es un rbol binario en el que cada hijo izquierdo de valor nulo es sustituido por un enlace o hilvn al nodo que le antecede en orden simtrico (excepto el primer nodo en orden simtrico) y cada hijo derecho de valor nulo es sustituido por un enlace o hilvn al nodo que le sigue en el recorrido en orden simtrico (excepto el ltimo nodo en orden simtrico).

rboles Hilvanados
Ahora, un recorrido en orden simtrico se puede implementar sin necesidad de recursin. Sin embargo, se requiere que los nodos tengan en su estructura algn atributo que permita saber cundo un enlace es real y cundo se trata de un hilvn. En este caso es necesario un atributo para cada hijo.

rbol Hilvanado
Cada nodo del rbol hilvanado contiene: Una referencia a su informacin. Un apuntador a su hijo izquierdo. Indicador Izquierdo (Verdadero o Falso). Un apuntador a su hijo derecho. Indicador Derecho (Verdadero o Falso).
5

Informacin
T

Indicador Izquierdo (T)


Hijo Izquierdo

Indicador Derecho (T) Hijo Derecho

rboles Hilvanados
5 T T

Recorrido Simtrico: 1, 3, 4, 5, 6, 8, 9

3 T T T

8 T

NULL

NULL

Construyendo rboles Hilvanados


1. Se coloca el nodo raz del rbol Si el nodo a insertar es el hijo izquierdo del nodo N:

Se pone como hijo izquierdo del nodo a insertar a lo que era el hijo izquierdo del nodo N. Se pone como hijo derecho del nodo a insertar al nodo N.
Se pone como hijo izquierdo del nodo N al nodo a insertar.

Construyendo rboles Hilvanados


Si el nodo a insertar es el hijo derecho del nodo N: Se pone como hijo derecho del nodo a insertar a lo que era el hijo derecho del nodo N.
Se pone como hijo izquierdo del nodo a insertar al nodo N. Se pone como hijo derecho del nodo N al nodo a insertar.

Construyendo rboles Hilvanados


A

A
B C F
F

T NULL D F T NULL

NULL B T T F

NULL C F

E T F T

F F F

NULL

rbol Hilvanado: Implementacin en C++


class TThreadedTreeNode : public TBinTreeNode { private: bool aIsLeft; // Indicador Izquierdo bool aIsRight; // Indicador Derecho public: TThreadedTreeNode(void* pInfo): TBinTreeNode(pInfo) { aIsLeft = false; aIsRight = false;} };

rboles Balanceados
La bsqueda en un rbol lexicogrfico puede convertirse en una bsqueda secuencial. Esto sucede porque el rbol no est balanceado, es decir los nodos no estn distribuidos uniformemente y se han insertado todos los nodos en profundidad. Esto podra ser salvado si se utilizara un rbol balanceado que al insertar toma en cuenta la cantidad de niveles del rbol y distribuye los nodos uniformemente.

rboles Balanceados
Los rboles balanceados (B-Tree) son rboles en los que cada nodo tiene entradas del mismo tipo. Un rbol balanceado no es un rbol de bsqueda binario, pues cada nodo puede tener ms de dos hijos.

rboles AVL
Un rbol AVL es un rbol binario de bsqueda en el que las alturas de los subrboles izquierdo y derecho de cualquier nodo se diferencian a lo sumo en uno.

La bsqueda es similar a como se hace en un rbol binario de bsqueda (lexicogrficos), pero la insercin y la eliminacin deben considerar la propiedad del balance.

rboles Generales
Director SubDir1 SubDir2 SubDir3

JDpto1

JDpto2

JDpto3

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.

rboles Generales
2 Transformar el rbol general en binario Cada nodo tiene en su enlace izquierdo a su primer hijo en el general y a la derecha de un nodo van sus hermanos en el general.
Aclaraciones: El rbol se convierte en binario donde el enlace izquierdo representa al primer hijo (en el rbol general) y el enlace derecho al siguiente hermano (en el rbol general). El rbol es ordenado porque a la izquierda est su primer hijo (si lo tiene) y a la derecha estarn sus hermanos (si los tiene) con sus descendientes.

Transformacin de General en Binario


A B E F C G rbol General D H E F G H El que no tiene hijo izquierdo es hoja en el general. El que no tiene hijo derecho es el ltimo hermano en el general. B C D A

rbol Binario del General

Transformacin de General en Binario


Floresta A B D C I F E G J H K L B A

rbol Binario de la Floresta E

C
I

F G H J

N - cantidad de rboles de la floresta. Si N=0 entonces el rbol binario es vaco. Si N>0 - raz del binario es raz del 1er rbol. Hijo izquierdo sus descendientes. Hijo derecho, la raz del 2do rbol.

K
L

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

TERM

Colocacin en Preorden Secuencial


A B E F C G H D E I J F G H I
ENLDER -1 4 3 -1 6 -1 -1 8 9 -1 INFO A B E F C G D H I J TERM F F T T F T F T T T

A B
C D

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 TERM 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 B E F C G H D E I J F G H I
ENLIZQ INFO FAM 4 -1 -1 -1 -1 -1 -1 A B C D H I J G E F 1 8 7 T F F T F
F T

A B
C D

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 B E F C G H D E I J F G H I
GRADO TERM 0 0 2 0 1 0 0 0 J 3 3

A B
C D

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