Estructura de datos - Departamento de Informáticamserrano/EDI/cap5.pdf · árbol con estructura de...

Post on 15-Mar-2020

5 views 0 download

Transcript of Estructura de datos - Departamento de Informáticamserrano/EDI/cap5.pdf · árbol con estructura de...

1

Universidad de ValladolidDepartamento de informática

Campus de Segovia

Estructura de datosTema 5: Árboles

Prof. Montserrat Serrano Montero

2

ÍNDICE

Primera parte:• Conceptos básicos• TAD Árbol binario• TAD Árbol de búsqueda

3

CONCEPTOS BÁSICOS• Árbol: Estructura no lineal que organiza sus

elementos formando jerarquías.

• Nodo: Elemento del árbol.• Árbol: Se define formalmente como una

estructura finita formada por un nodo al cual están conectados ninguno, uno o más árboles disjuntos (no comparten elementos). Definición recursiva: lo definido se encuentra dentro de la definición.

4

CONCEPTOS BÁSICOS• Bosque: Conjunto de dos o más árboles.• Subárbol: Subconjunto de elementos de un

árbol con estructura de árbol.• Raíz: Nodo superior de un árbol. Al nodo raíz

se le asocia el nivel 1. Nivel cero para el árbol vacío.

• Si existe una arista (rama) dirigida del nodo n al nodo m, entonces n es el padre o ascendiente directo de m y m es un hijo o descendiente directo de n. Los hijos del mismo padre son hermanos.

• Un nodo que no tiene hijos se llama hoja del árbol. Nodo terminal.

• Nodo interior o rama: Tiene descendientes.

5

CONCEPTOS BÁSICOS

• Camino: Secuencia de nodos conectados dentro de un árbol.

• Nodo ascendiente y descendiente: n es antecesor de m si existe un camino de n a m y en este caso, m es descendiente de n.

• Longitud del camino: Número de nodos menos uno (r-1). (5-1) en el ej.

6

CONCEPTOS BÁSICOS• Nivel de un nodo: La longitud del camino

desde el nodo raíz al nodo considerado, más uno.

• Altura o profundidad de un árbol: El nivel más alto del árbol (o nivel máximo de los nodos de un árbol).

• Grado (aridad): Número de hijos de un nodo. El grado de un árbol se define como el máximo del grado de sus nodos.Árbol ternario: Árbol de grado 3.Un árbol unario sería un árbol de grado 1. A este árbol se le llama lista (árbol degenerado)

• El máximo número de nodos de un árbol de altura “h” y grado “g” sería:1 + g + g2 + g3 +...+ gh-1 = ∑ gi ; 0 ≤ i ≤ (h -1)

7

CONCEPTOS BÁSICOS

• Representación de árboles:a) Grafo

b) Jerarquía de márgenes

c) Conjuntos incluidos

d) Listas incluidas

8

TAD ÁRBOL BINARIO• Árbol binario: Árbol de grado 2. De cada

nodo parten como máximo dos subárboles disjuntos (izquierdo y derecho). También puede estar vacío.

ESPECIFICACIÓN INFORMAL:TAD ArbolB (VALORES: rango del problema;

OPERACIONES: Inicia, EsVacio, Insertar, Suprimir, Izquierdo, Derecho, Raiz);

Inicia ( ) → ArbolBEfecto: Crea un árbol binario vacío y lo deja en disposición de ser utilizado.

EsVacio (ArbolB) → BooleanEfecto: Devuelve true si el árbol binario es vacío y false en caso contrario.

9

TAD ÁRBOL BINARIOInsertar (ArbolB, Elemento) → ArbolB

Efecto: Introduce en el ArbolB un nuevo nodo cuyo valor está dado por el Elemento pasado.

Excepción: Árbol lleno en implementa. estática.Suprimir (ArbolB, Elemento) → ArbolB

Efecto: Borra del árbol binario el nodo cuyo valor coincide con el que se pasa en Elemento, si éste existe.

Excepción: Error si el árbol binario está vacío.Izquierdo (ArbolB) → ArbolB

Efecto: Devuelve el hijo izquierdo del árbol binario pasado como entrada.

Excepción: Error si el árbol binario está vacío.Derecho (ArbolB) → ArbolB

Efecto: Devuelve el hijo derecho del árbol binario pasado como entrada.

Excepción: Error si el árbol binario está vacío.Raiz (ArbolB) → Elemento

Efecto: Devuelve el Elemento contenido en el nodo raíz del árbol binario pasado como entrada.

Excepción: Error si el árbol binario está vacío.

10

DECLARACIÓN DE TIPOS• Con arrays: constMaxNodos = ...;

typeindice = 0..MaxNodos; {máx nº de nodos}tInfo = ...; {depende del problema}tNodo = record

info: tInfo;iz: indice;de: indice;

end;tArbol = record

raiz: indice; (1)libre: indice; (6)nodos: array [1..MaxNodos] of tNodo;

end;

11

DECLARACIÓN DE TIPOS• Con punteros: (seguir con esta implementación)tInfo = ...; {depende del problema}tArbol = ^Nodo;Nodo = record

info: tInfo;iz, de: tArbol

end;

12

ALGORITMOS BÁSICOSprocedure Inicia (var ArbolB: tArbol);begin

ArbolB:= nilend;

function EsVacio (ArbolB: tArbol): boolean;begin

EsVacio:= (ArbolB = nil)end;

function Izquierdo (ArbolB: tArbol): tArbol;begin

if not EsVacio (ArbolB) then Izquierdo:= ArbolB^.izelse writeln (‘El árbol está vacío’)

end;function Derecho (ArbolB: tArbol): tArbol;begin

if not EsVacio (ArbolB) then Derecho:= ArbolB^.deelse writeln (‘El árbol está vacío’)

end;procedure Raiz (ArbolB: tArbol; var Elemento: tInfo);

beginif not EsVacio (ArbolB) then Elemento:= ArbolB^.infoelse writeln (‘El árbol está vacío’)

end;

13

ALGORITMOS DE RECORRIDO• Utilizados para visualizar o consultar datos

almacenados en un árbol.

• Métodos:a) En profundidad: Recorre el árbol por subárboles.

1. Enorden2. Preorden3. Postorden

b) En amplitud: Recorre el árbol por niveles.

• Los métodos en profundidad pueden implementarse de forma recursiva e iterativa. La forma iterativa requiere utilizar una pila.

• El recorrido en amplitud se implementa de forma iterativa con ayuda de una cola como estructura de datos auxiliar.

• Aplicación de estos algoritmos: acceso a datos de almacenamiento en memoria secundaria.

14

ALGORITMOS DE RECORRIDO• Recorrido recursivo enorden (IND):

1. Recorrer el subárbol izquierdo (I)2. Visitar el nodo raíz (N)3. Recorrer el subárbol derecho (D).

procedure enorden (Arbol: tArbol);beginif Arbol <> nil thenbeginenorden (Arbol^.iz);write (Arbol^.info, ‘- ‘);enorden (Arbol^.de)

endend;

1

2 3

4 5 6 7

Resultado: 4-2-5-1-6-3-7

15

ALGORITMOS DE RECORRIDO• Recorrido recursivo preorden (NID):

1. Visitar el nodo raíz (N) 2. Recorrer el subárbol izquierdo (I).3. Recorrer el subárbol derecho (D).

procedure preorden (Arbol: tArbol);beginif Arbol <> nil thenbegin

write (Arbol^.info, ‘- ‘);preorden (Arbol^.iz);preorden (Arbol^.de)

endend;

1

2

6 7

3

4 5

Resultado: 1-2-4-5-3-6-7

16

ALGORITMOS DE RECORRIDO• Recorrido recursivo postorden (IDN):

1. Recorrer el subárbol izquierdo (I).2. Recorrer el subárbol derecho (D).3. Visitar el nodo raíz (N).

procedure postorden (Arbol: tArbol);beginif Arbol <> nil thenbeginpostorden (Arbol^.iz);postorden (Arbol^.de);write (Arbol^.info, ‘ - ‘)

endend;

1

2

6

3

4 5 7

Resultado: 4-5-2-6-7-3-1

17

ALGORITMOS DE RECORRIDO• Hay otras posibles combinaciones,

considerando recorrido primero el subárbol derecho: 1. Enorden: DNI2. Preorden: NDI3. Postorden: DIN

• Ejemplo. Deducir los tres recorridos en profundidad del árbol binario siguiente:

B

H I J

E

A

F G

C

D

Enorden: H-D-I-B-J-E-A-F-C-GPreorden: A-B-D-H-I-E-J-C-F-GPostorden: H-I-D-J-E-B-F-G-C-A

7-3-6-1-5-2-41-3-7-6-2-5-47-6-3-5-4-2-1

ALGORITMOS DE RECORRIDO

18

• Recorrido iterativo en amplitud:1. Tomar el puntero a la raíz y ponerlo en la cola.2. Quitar el primer elemento de la cola, mostrar el contenido del nodo y almacenar en la cola los punteros correspondientes a sus hijos izquierdo y derecho.3. Repetir el paso 2.

procedure amplitud (Arbol: tArbol);var A: tArbol; cola: tCola;beginInicia (cola);A:= Arbol;if A<>nil then Encolar (cola, A);while not EsVacia (cola) dobegin

Desencolar (cola, A);write (A^.info, ‘ – ‘);if A^.iz <> nil then Encolar (cola, A^.iz);if A^.de <> nil then Encolar (cola, A^.de)end

end;

19

ALGORITMOS DE RECORRIDO• Recorrido iterativo enorden (IND):

Se utiliza una pila donde almacenar punteros a los distintos nodos del árbol.

1. Se van colocando en la pila punteros, a la raíz y los sucesivos hijos izquierdos de cada nodo.

2. Recupera de la pila y escribe 1. Como 1 no tiene hijo derecho, recupera de la pila y escribe 4. El hijo derecho de 4 es 6. Pone en la pila el puntero a 6.

3. Se recupera de la pila y se escribe el 6. Como no tiene hijo derecho, se pasa a recuperar de la pila y a escribir el 8. El 8 tiene un hijo derecho, que se coloca en la pila. Después se coloca en la pila el hijo izquierdo de 12 que será el que se recupere a continuación.

20

ALGORITMOS DE RECORRIDO• Recorrido iterativo enorden (IND):

procedure enorden (Arbol: tArbol);var A: tArbol; P: tPila;begin

Inicia (P);A := Arbol;repeat

while A <> nil dobegin

Apilar (P, A); A := A^.iz

end;if not EsVacia (P) thenbegin

Cima (P, A);Desapilar (P);write (A^.info, ‘ – ‘);A := A^.de

end;until EsVacia (P) and EsVacio (A)

end;

21

ÁRBOLES DE EXPRESIÓN

• Los árboles binarios se utilizan para almacenar expresiones aritméticas en memoria, esencialmente en compiladores de lenguajes de programación.

• Los paréntesis no se almacenan en el árbol pero están implicados en la forma del árbol.

(A + B) * C A + B * C

22

ÁRBOLES DE EXPRESIÓN

• Ejemplo 1: Deducir las expresiones que representan los siguientes árboles binarios.

Solución:a) X * (Y / - Z)b) A + [ (B * - (C + D)]c) [A * ( X + Y)] * C

• Ejemplo 2: Dibujar la representación en árbol binario de cada una de las siguientes expresiones:a) X * Y / [ (A + B) * C ]b) (X * Y / A) + (B * C)

23

ÁRBOLES BINARIOS DE BÚSQUEDA

• Árbol binario de búsqueda: Árbol binario ordenado. El valor en el nodo raíz es mayor que todos los del subárbol izquierdo y menor que todos los del subárbol derecho.

• Si recorremos el árbol enorden, está ordenado.• Las operaciones básicas sobre este tipo de

árboles binarios son:a) Búsquedab) Inserciónc) Borradod) Recorridos

24

ESPECIFICACIÓN• TAD Árbol binario de búsqueda:

Busqueda (ABB, Clave) → ABBEfecto: Devuelve el valor de una referencia al nodo que tiene la clave buscada y nil si la clave no está en el árbol.

Insertar (ABB, Clave) → ABBEfecto: Introduce en el árbol como nodo hoja, la clave pasada como valor de entrada.

Suprimir (ABB, Clave) → ABBEfecto: Borra del árbol binario el elemento pasado como entrada, si éste existe.

Excepción: Error si el árbol binario está vacío.

25

IMPLEMENTACIÓN• Operación Búsqueda:

function Busqueda (ABB: tArbol; Clave: tInfo): tArbol;

beginif ABB = nil then Busqueda := nilelse

if ABB^.info = Clave thenBusqueda := ABB

elseif ABB^.info > Clave thenBusqueda := Busqueda (ABB^.iz, Clave)

elseBusqueda := Busqueda (ABB^.de, Clave)

end;

26

IMPLEMENTACIÓN

• Operación Insertar:

• Pasos a seguir:1. Asignar memoria para un nuevo nodo.2. Buscar en el árbol para encontrar la posición de inserción del nuevo nodo, que se colocarácomo nodo hoja. 3. Enlazar el nuevo nodo al árbol.

• Ej: Tenemos que almacenar los números 8 3 1 20 1 10 5 4

Para insertar 8, la única elección es insertar 8 en el nodo raíz:

Como 3 < 8, 3 va en el subárbol izquierdo.

27

IMPLEMENTACIÓN• Operación Insertar:El 1 irá a la izquierda y debajo de 3:

20 debe ir a la derecha de 8Los restantes elementos se sitúan de la misma forma:

28

IMPLEMENTACIÓN• Operación Insertar:

procedure Insertar (var ABB: tArbol; Clave: tInfo);var N: tArbol;begin

if ABB = nil thenbeginnew (N);N^.info := Clave;N^.iz := nil;N^.de := nil;ABB := N;

endelse if ABB^.info > Clave then {Clave menor}

Insertar (ABB^.iz, Clave) {Izquierda}elseif ABB^.info < Clave thenInsertar (ABB^.de, Clave) {Derecha}

end;

Crea el nodo cuando se llega a una posición hoja

29

IMPLEMENTACIÓN• Operación Suprimir: Compleja, ya que el

nodo a suprimir puede ser cualquiera y la operación de supresión debe mantener la estructura del ABB.

• Se pueden presentar 3 casos con tratamientos diferentes:1. El nodo a borrar es un nodo hoja.

- Se borra el nodo.2. El nodo a borrar sólo tiene un descendiente.

- Se puentea el nodo.3. El nodo a borrar es normal, es decir, tiene los dos nodos hijos: (2 alternativas)

a) Reemplazar la clave a eliminar por la mayor de las claves menores.b) Reemplazar la clave a eliminar por la menor de las claves mayores.

• Implementamos con un ejemplo el caso 3, alternativa a).

30

IMPLEMENTACIÓN

• Se quiere borrar la clave 20. Pasos a seguir:1. Situarse en el nodo raíz del subárbol izquierdo del nodo a borrar.2. Se desciende por la derecha hasta encontrar un nodo N sin descendiente derecho.3. Se traslada la clave del nodo N al nodo a borrar.4. Se borra el nodo N.

31

IMPLEMENTACIÓN

• Árbol resultante, una vez borrada la clave 20.

• Es un árbol de búsqueda:1, 5, 10, 12, 15, 17, 18, 22, 24, 30, 35

32

IMPLEMENTACIÓN• Operación Suprimir:

procedure Suprimir (var ABB: tArbol; Clave: tInfo);var N: tArbol;beginif ABB < > nil then

if ABB^.info > Clave then {Clave menor}Suprimir (ABB^.iz, Clave)

else if ABB^.info < Clave then {Clave mayor}Suprimir (ABB^.de, Clave)

else {Clave encontrada}beginN := ABB;{Puntero aux al nodo a borrar}if ABB^.iz = nil then {Comprueba 2ABB := ABB^.de descendientes}

else if ABB^.de = nil thenABB := ABB^.izelse Borra2hijos (ABB^.iz); {Se toma el

dispose (N) nodo izq a la claveend que se quiere borrar}

end;

procedure Borra2hijos (var ABB: tArbol);

33

IMPLEMENTACIÓN• Operación Suprimir:

procedure Borra2hijos (var ABB: tArbol);beginif ABB^.de < > nil then {Se desciende por laBorra2hijos (ABB^.de) derecha hasta nodo

else hoja derecha}begin{Se cambia la información de la clave aborrar por la mayor de las claves menores}N^.info := ABB^.info;{Puntero auxiliar al nuevo nodo a borrar}N := ABB;{Se enlaza al árbol el posible nodo izquierdodel nuevo a borrar}ABB := ABB^.iz

endend;

34

INTERÉS DE LOS ABB

• El esfuerzo para localizar un elemento es menor que en una lista.

• El nº de comparaciones, como máximo en un ABB, es el nº de niveles del árbol, que es más pequeño cuanto más completo sea el árbol.

• Dada una estructura con n elementos:1. En una lista habrá que hacer una media

de n/2 comparaciones.2. En un ABB habrá que hacer 2k-1

comparaciones siendo k la altura del árbol.n = 2k-1; 2k-1=2*log2(n+1)-1

35

Estructura de datosTema 5: Árboles equilibrados

Prof. Montserrat Serrano Montero

Universidad de ValladolidDepartamento de informática

Campus de Segovia

36

Nadie que no haya cometido nunca un error ha intentado nunca algo nuevo.

Einstein

ÍNDICE

Segunda parte:• Conceptos básicos• Buscando el equilibrio.• Diseño e implementaciónde árboles AVL

37

INTERÉS DE LOS ÁRBOLES DE BÚSQUEDA

• Optimizar el proceso de búsqueda.

En el caso de un árbol binario ordenadohabrá que hacer un máximo de k comparaciones para encontrar el elemento buscado, siendo k la altura del árbol.En el caso más favorable, el árbol binario estácompleto. Así, el número máximo de elementos que puede tener un árbol binario de altura h es:

nmax = 1 + 2 + 4 + 8 + ...+ 2 k-1 = 2k –1k = log2(nmax + 1)

38

CONCEPTOS BÁSICOS

• Si los elementos se añaden en el árbol según el algoritmo de inserción visto para los ABB, la estructura resultante del árbol dependerádel orden en que sean añadidos.

• Si todos los elementos se insertan en orden creciente o decreciente, el árbol va a tener todas sus ramas izquierda o derecha, respectivamente, vacías.

• La búsqueda en estos árboles será totalmente secuencial. Comparaciones: O (n)

39

CONCEPTOS BÁSICOS

• La idea asociada a la eficiencia en la búsqueda de un elemento es la de árbol equilibrado.

• Intuitivamente quiere decir que “una rama del árbol no sea mucho más larga que otra”, “que el número de niveles no sea demasiado grande para el número de nodos existentes”, “que no haya desproporción de elementos de una rama con respecto a otra”.

40

CONCEPTOS BÁSICOS• Un árbol binario lleno de altura h tiene todas

sus hojas a nivel h y todos los nodos que están a nivel menor que h tiene cada uno dos hijos.

• Un árbol binario completo de altura h es un árbol binario que está relleno a partir del nivel h-1, con el nivel h relleno de izquierda a derecha.

• Un árbol binario lleno, es completo.

41

CONCEPTOS BÁSICOS• Un árbol perfectamente equilibrado es un

árbol binario en el que para todo nodo, el número de nodos en el subárbol izquierdo y el número de nodos en el subárbol derecho difieren como mucho en una unidad.

• Un árbol equilibrado en sentido AVL(Adelson-Velskii y Landis, 1962) es un árbol binario en el que la diferencia de alturas de los subárboles izquierdo y derecho correspondientes a cualquier nodo del árbol no es superior a uno.

42

CONCEPTOS BÁSICOS

• Un árbol binario completo es un árbol equilibrado, mientras que un árbol binario lleno es totalmente equilibrado.

En la figura:a) Árbol equilibrado AVLb) Árbol totalmente equilibradoc) y d) Árboles no equilibrados

43

CONCEPTOS BÁSICOS

• Un árbol binario de búsqueda va perdiendo o ganando equilibrio al insertar o suprimir elementos.

• Ejemplo:

Árbol binario de búsqueda equilibrado.Árbol perfectamente equilibrado, tras insertar 10.Árbol totalmente equilibrado, tras insertar 14.Árbol lleno.

44

ÁRBOL BINARIO EQUILIBRADO (AVL)

• La altura o profundidad de un árbol binario es el nivel máximo de sus hojas. La altura de un árbol nulo se considera cero.

• El factor de equilibrio o balance de un nodo se define como la altura del subárbol derecho menos la altura del subárbol izquierdo correspondiente.

• El factor de equilibrio de cada nodo en un árbol equilibrado será 1, -1 ó 0.

45

BUSCANDO EL EQUILIBRIO• Los algoritmos de inserción y borrado de los

ABB no garantizan que la estructura resultante sea equilibrada en sentido AVL.

• Es necesario definir otras operaciones auxiliares que se van a utilizar para garantizar que estas inserciones y supresiones sean equilibradas.

• Estas operaciones o manipulaciones se denominan rotaciones de nodos.

• Existen dos tipos de rotaciones de nodos:A) Simples: Izquierda y derecha.B) Dobles: Sucesiones de dos simples.

46

BUSCANDO EL EQUILIBRIO• ROTACIÓN SIMPLE IZQUIERDA:

A1 < A < A2 < B < A3

• Ejemplo:

47

BUSCANDO EL EQUILIBRIO• ROTACIÓN SIMPLE DERECHA:

A1 < A < A2 < B < A3

• Ejemplo:

• Construir el ABB mediante la inserción de los elementos 1, 2, 3, 4, 5, 6 y 7 de forma que quede equilibrado AVL.

48

BUSCANDO EL EQUILIBRIO• ROTACIÓN DOBLE IZQUIERDA-DERECHA:

• Ejemplo:

49

BUSCANDO EL EQUILIBRIO• ROTACIÓN DOBLE DERECHA-IZQUIERDA:

• Ejemplo:

.

50

Diseño e implementaciónde árboles AVL

• DECLARACIÓN DE TIPOS:• Añadimos al tipo de datos que representa

cada nodo un campo más: el factor de equilibrio (fe).

typetInfo = ...;tArbolE = ^NodoAE;NodoAE = record

Info: tInfo;Fe: -1..1;Iz, De: tArbolE

end;

51

INSERCIÓN EN AVL• Se quiere insertar un nodo en un árbol

equilibrado en sentido AVL de raíz R y subárboles izquierdo I y derecho D.

• Supóngase que se inserta en I aumentando su altura. Esta inserción puede dar lugar a tres situaciones distintas:

Caso A:• hI = hD Tras la inserción se conserva el

equilibrio. No es necesario realizar ninguna operación para restaurar el equilibrio.

52

INSERCIÓN EN AVLCaso B:• hI < hD Tras la inserción, ambos subárboles

tienen la misma altura. Se mejora la condición de equilibrio del árbol.

Caso C:• hI > hD Tras la inserción, la diferencia de

alturas entre los subárboles es mayor que la unidad. El árbol se desequilibra y hay que hacer rotaciones para que siga siendo AVL.Dos subcasos:1. Inserción de un nodo menor que el raíz de I.2. Inserción de un nodo mayor que el raíz de I.

INSERCIÓN EN AVLCaso C: Ejemplo

1. Se produce al insertar un nodo de clave 1 ó 3. Este índice es menor que el nodo raíz del subárbol izquierdo (4). La rotación a llevar a cabo para reequilibrar el árbol sería una rotación simple izquierda sobre el nodo raíz del árbol desequilibrado: el 8.

53

2. Se produce al insertar un nodo de clave 5 ó 7. Este índice es mayor que el nodo raíz del subárbol izquierdo (4). La rotación a llevar a cabo sería una rotación doble izquierda-derecha sobre el nodo raíz del árbol desequilibrado.

54

Diseño e implementaciónde árboles AVL

• INSERCIÓN: (tratamiento rotaciones)• Inserción de las claves 68, 45, 29:

• Movimiento de los punteros: Rotación I

(1) n^.iz := n1^.de;(2) n1^.de := n;(3) n := n1

nil(1)

55

Diseño e implementaciónde árboles AVL

• INSERCIÓN: (tratamiento rotaciones)• Inserción de las claves 75 y 90:

• Movimiento de los punteros: Rotación D

(1) n^.de := n1^.iz;(2) n1^.iz := n;(3) n := n1

nil(1)

56

Diseño e implementaciónde árboles AVL

• INSERCIÓN: (tratamiento rotaciones)• Inserción de la clave 70:

• Movimiento de los punteros: Rotación DI

(1) n1^.iz := n2^.de;(2) n2^.de := n1;(3) n^.de := n2^.iz;(4) n2^.iz := n;(5) n := n2

(3)

nil

57

Diseño e implementaciónde árboles AVL

• INSERCIÓN: (tratamiento rotaciones)• Inserción de la clave 34:

• Movimiento de los punteros: Rotación ID

(1) n1^.de := n2^.iz;(2) n2^.iz := n1;(3) n^.iz := n2^.de;(4) n2^.de := n;(5) n := n2 (3)

nil(1)

nil

58

Diseño e implementaciónde árboles AVL

• INSERCIÓN:function EsVacio (R: tArbolE): boolean;beginEsVacio:= (R = nil)

end;

function Crear (Clave: tInfo): tArbolE;var n: tArbolE;beginnew (n);with n^ dobegin

info:= Clave;iz := nil;de := nil;fe := 0 {propio de un nodo hoja}

end;Crear := n

end;

Diseño e implementaciónde árboles AVL

59

• INSERCIÓN:

procedure rsi (var n: tArbolE; n1: tArbolE);begin(1) n^.iz := n1^.de;(2) n1^.de := n;if n1^.fe = -1 thenbegin{Si la rotación es por inserción se cumple}

n^.fe := 0;n1^.fe := 0

endelse begin {n1^.fe=0}

n^.fe := -1;n1^.fe := 1

end;(3) n := n1;end;

Los factores de equilibrio se incrementan en uno si se fue por la rama derecha, se decrementa en 1 si se fue por la rama izquierda.

Ajuste del factor de equilibrio

60

Diseño e implementaciónde árboles AVL

• INSERCIÓN:

procedure rdid (var n: tArbolE; n1: tArbolE);var n2: tArbolEbeginn2 := n1^.de;(3) n^.iz := n2^.de;(4) n2^.de := n;(1) n1^.de := n2^.iz;(2) n2^.iz := n1;if (n2^.fe = 1) then n1^.fe := -1else n1^.fe := 0;if (n2^.fe = -1) then n^.fe :=1else n^.fe := 0;n2^.fe := 0;(5) n := n2;

end;

Ajuste del factor de equilibrio

61

Diseño e implementaciónde árboles AVL

• INSERCIÓN:

procedure rsd (var n: tArbolE; n1: tArbolE);begin(1) n^.de := n1^.iz;(2) n1^.iz := n;if n1^.fe = 1 thenbegin {Si la rotación es por

inserción se cumple}n^.fe := 0;n1^.fe := 0

endelse begin {n1^.fe=0}n^.fe := 1;n1^.fe := -1

end;(3) n := n1;

end;

Ajuste del factor de equilibrio

62

Diseño e implementaciónde árboles AVL

• INSERCIÓN:

procedure rddi (var n: tArbolE; n1: tArbolE);var n2: tArbolEbeginn2 := n1^.iz;(3) n^.de := n2^.iz;(4) n2^.iz := n;(1) n1^.iz := n2^.de;(2) n2^.de := n1;if (n2^.fe = 1) then n^.fe := -1else n^.fe := 0;if (n2^.fe = -1) then n1^.fe :=1else n1^.fe := 0;n2^.fe := 0;(5) n := n2;

end;

63

Diseño e implementación de árboles AVL• INSERCIÓN:

procedure InsertarE (var r: tArbolE; var hh: boolean; Clave: tInfo);

var n1: tArbolE;beginif EsVacio (r) then {se ha llegado a nodo hoja}beginr := Crear (Clave); hh := true {la altura del árbol ha crecido}

end;else if (Clave < r^.info) then {Seguimos por la izquierda}

beginInsertarE (r^.iz, hh, Clave);if hh then {decrementar en 1 Fe porque se insertó porcase r^.fe of rama izquierda}1: begin

r^.fe := 0; hh := falseend;

0: r^.fe := -1;-1: begin {Debe valer –2. Desequilibrio izquierda}

n1 := r^.iz;if (n1^.fe = -1) then rsi (r, n1) {desequilibrio izq}else rdid (r, n1); {n1^.fe = 1}hh := false

endend; {case}

end {if}

64

Diseño e implementación de árboles AVL• INSERCIÓN:

else if (Clave > r^.info) then {Seguimos por la derecha}begin

InsertarE (r^.de, hh, clave);if hh then {incrementar en 1 Fe porque se insertó porcase r^.fe of rama derecha}-1: begin {se reequilibra solo}

r^.fe := 0; hh := falseend;

0: r^.fe := 1;1: begin {Debe valer 2. Desequilibrio derecha}

n1 := r^.de;if (n1^.fe = 1) then rsd (r, n1) {desequilibrio dcha}else rddi (r, n1);hh := false

endend; {case}

end {if}else begin {Clave = r^.info}

writeln (‘No está previsto insertar claves repetidas’);hh := false

endend;

65

SUPRIMIR EN AVL• Sigue la estrategia del algoritmo de supresión

en árboles binarios de búsqueda.

• Al suprimir un nodo con cierta clave, el árbol resultante debe seguir siendo un árbol equilibrado.

• Una vez eliminado un nodo siguiendo los criterios ABB, se regresa por el camino calculando los nuevos factores de equilibrio (Fe).

• Si en alguno de los nodos se viola el criterio de equilibrio debe restaurarse el mismo, teniendo en cuenta que pueden producirse más de una rotación en el retroceso.

• En los procedimientos el argumento booleanhh, será activado cuando la altura del árbol disminuya por eliminación de nodo o reestructuración del subárbol.

66

SURPIMIR EN AVL• Casos en la reestructuración:Caso A: Eliminar el nodo con clave 42

Rotación I, porque n^.fe := -2 y n1^.fe < = 0

67

SUPRIMIR EN AVL• Casos en la reestructuración:Caso B: Eliminar el nodo con clave 21

Rotación DI, porque n^.fe := 2 y n1^.fe < 0

El Fe del nodo visitado disminuye en 1 si la eliminación se hizo por su rama derecha y se incrementa en 1 si la eliminación se hizo por su rama izquierda.

68

SUPRIMIR EN AVL• Casos en la reestructuración:Caso C: Eliminar el nodo con clave 25

Rotación D, porque n^.fe := 2 y n1^.fe >= 0

69

SUPRIMIR EN AVL• Casos en la reestructuración:Caso B: Reestructurar 65:

Rotación DI, porque n^.fe := 2 y n1^.fe < 0

70

Diseño e implementaciónde árboles AVL

• SUPRIMIR:procedure EquilibrarI (var n: tArbolE; var hh:var n1: tArbolE; boolean);begincase n^.fe of-1: n^.fe := 0;0 : begin

n^.fe := 1; hh := falseend;

1: begin {Hay que restaurar el equilibrio}n1:= n^.de;if n1^.fe >=0 thenbeginif n1^.fe = 0 then hh := false; {no disminuye h}rsd (n, n1)

endelse rddi (n, n1)

end;end

end;

71

Diseño e implementaciónde árboles AVL

• SUPRIMIR:procedure EquilibrarD (var n: tArbolE; var hh:var n1: tArbolE; boolean);begincase n^.fe of1 : n^.fe := 0;0 : begin

n^.fe := -1; hh := falseend;

-1: begin {Hay que restaurar el equilibrio}n1:= n^.iz;if n1^.fe <=0 thenbeginif n1^.fe = 0 then hh := false; rsi (n, n1)

endelse rdid (n, n1)

end;end

end;

72

Diseño e implementación de árboles AVL

• SUPRIMIR:

procedure SuprimirE (var r: tArbolE; var hh: boolean; Clave: tInfo);

var q: tArbolE;procedure bor (var d: tArbolE; var hh: boolean);beginif d^.de <> nil thenbegin

bor (d^.de,hh);if hh then EquilibrarD (d, hh);

endelse begin

q^.info := d^.info;q := d;d := d^.iz;hh := true

endend;

73

Diseño e implementación de árboles AVL

• SUPRIMIR:begin {Suprimir}if not EsVacio(r) then

if Clave < r^.info thenbeginSuprimir (r^.iz, hh, Clave);if hh then EquilibrarI (r, hh)

endelse if Clave > r^.info then

beginSuprimir (r^.de, hh, Clave);if hh then EquilibrarD (r, hh)

endelse begin {Ha sido encontrado el nodo}

q := r;if q^.de = nil thenbeginr := q^.iz; hh:= true {Disminuye la altura}

end (Sigue)

Diseño e implementación de árboles AVL

• SUPRIMIR:else if q^.iz = nil then

beginr := q^.de; hh := true

endelse begin

bor ( q^.iz, hh);if hh then EquilibrarI (r, hh)end

dispose (q);end {else encontrar nodo}

end;

74

75

Ejemplos de supresión de nodos

• Dado el siguiente árbol, realizar las supresiones de nodos siguientes de forma que en cada paso quede un árbol AVL: 5, 9, 8, 6, 3

76

Estructura de datosTema 5: Árboles equilibrados

Prof. Montserrat Serrano Montero

Universidad de ValladolidDepartamento de informática

Campus de Segovia

77

Nadie que no haya cometido nunca un error ha intentado nunca algo nuevo.

Einstein

ÍNDICE

Segunda parte:• Conceptos básicos• Buscando el equilibrio.• Diseño e implementaciónde árboles AVL

78

INTERÉS DE LOS ÁRBOLES DE BÚSQUEDA

• Optimizar el proceso de búsqueda.

En el caso de un árbol binario ordenadohabrá que hacer un máximo de k comparaciones para encontrar el elemento buscado, siendo k la altura del árbol.En el caso más favorable, el árbol binario estácompleto. Así, el número máximo de elementos que puede tener un árbol binario de altura h es:

nmax = 1 + 2 + 4 + 8 + ...+ 2 k-1 = 2k –1k = log2(nmax + 1)

79

CONCEPTOS BÁSICOS

• Si los elementos se añaden en el árbol según el algoritmo de inserción visto para los ABB, la estructura resultante del árbol dependerádel orden en que sean añadidos.

• Si todos los elementos se insertan en orden creciente o decreciente, el árbol va a tener todas sus ramas izquierda o derecha, respectivamente, vacías.

• La búsqueda en estos árboles será totalmente secuencial. Comparaciones: O (n)

80

CONCEPTOS BÁSICOS

• La idea asociada a la eficiencia en la búsqueda de un elemento es la de árbol equilibrado.

• Intuitivamente quiere decir que “una rama del árbol no sea mucho más larga que otra”, “que el número de niveles no sea demasiado grande para el número de nodos existentes”, “que no haya desproporción de elementos de una rama con respecto a otra”.

81

CONCEPTOS BÁSICOS• Un árbol binario lleno de altura h tiene todas

sus hojas a nivel h y todos los nodos que están a nivel menor que h tiene cada uno dos hijos.

• Un árbol binario completo de altura h es un árbol binario que está relleno a partir del nivel h-1, con el nivel h relleno de izquierda a derecha.

• Un árbol binario lleno, es completo.

82

CONCEPTOS BÁSICOS• Un árbol perfectamente equilibrado es un

árbol binario en el que para todo nodo, el número de nodos en el subárbol izquierdo y el número de nodos en el subárbol derecho difieren como mucho en una unidad.

• Un árbol equilibrado en sentido AVL(Adelson-Velskii y Landis, 1962) es un árbol binario en el que la diferencia de alturas de los subárboles izquierdo y derecho correspondientes a cualquier nodo del árbol no es superior a uno.

83

CONCEPTOS BÁSICOS

• Un árbol binario completo es un árbol equilibrado, mientras que un árbol binario lleno es totalmente equilibrado.

En la figura:a) Árbol equilibrado AVLb) Árbol totalmente equilibradoc) y d) Árboles no equilibrados

84

CONCEPTOS BÁSICOS

• Un árbol binario de búsqueda va perdiendo o ganando equilibrio al insertar o suprimir elementos.

• Ejemplo:

Árbol binario de búsqueda equilibrado.Árbol perfectamente equilibrado, tras insertar 10.Árbol totalmente equilibrado, tras insertar 14.Árbol lleno.

85

ÁRBOL BINARIO EQUILIBRADO (AVL)

• La altura o profundidad de un árbol binario es el nivel máximo de sus hojas. La altura de un árbol nulo se considera cero.

• El factor de equilibrio o balance de un nodo se define como la altura del subárbol derecho menos la altura del subárbol izquierdo correspondiente.

• El factor de equilibrio de cada nodo en un árbol equilibrado será 1, -1 ó 0.

86

BUSCANDO EL EQUILIBRIO• Los algoritmos de inserción y borrado de los

ABB no garantizan que la estructura resultante sea equilibrada en sentido AVL.

• Es necesario definir otras operaciones auxiliares que se van a utilizar para garantizar que estas inserciones y supresiones sean equilibradas.

• Estas operaciones o manipulaciones se denominan rotaciones de nodos.

• Existen dos tipos de rotaciones de nodos:A) Simples: Izquierda y derecha.B) Dobles: Sucesiones de dos simples.

87

BUSCANDO EL EQUILIBRIO• ROTACIÓN SIMPLE IZQUIERDA:

A1 < A < A2 < B < A3

• Ejemplo:

88

BUSCANDO EL EQUILIBRIO• ROTACIÓN SIMPLE DERECHA:

A1 < A < A2 < B < A3

• Ejemplo:

• Construir el ABB mediante la inserción de los elementos 1, 2, 3, 4, 5, 6 y 7 de forma que quede equilibrado AVL.

89

BUSCANDO EL EQUILIBRIO• ROTACIÓN DOBLE IZQUIERDA-DERECHA:

• Ejemplo:

90

BUSCANDO EL EQUILIBRIO• ROTACIÓN DOBLE DERECHA-IZQUIERDA:

• Ejemplo:

.

91

Diseño e implementaciónde árboles AVL

• DECLARACIÓN DE TIPOS:• Añadimos al tipo de datos que representa

cada nodo un campo más: el factor de equilibrio (fe).

typetInfo = ...;tArbolE = ^NodoAE;NodoAE = record

Info: tInfo;Fe: -1..1;Iz, De: tArbolE

end;

92

INSERCIÓN EN AVL• Se quiere insertar un nodo en un árbol

equilibrado en sentido AVL de raíz R y subárboles izquierdo I y derecho D.

• Supóngase que se inserta en I aumentando su altura. Esta inserción puede dar lugar a tres situaciones distintas:

Caso A:• hI = hD Tras la inserción se conserva el

equilibrio. No es necesario realizar ninguna operación para restaurar el equilibrio.

93

INSERCIÓN EN AVLCaso B:• hI < hD Tras la inserción, ambos subárboles

tienen la misma altura. Se mejora la condición de equilibrio del árbol.

Caso C:• hI > hD Tras la inserción, la diferencia de

alturas entre los subárboles es mayor que la unidad. El árbol se desequilibra y hay que hacer rotaciones para que siga siendo AVL.Dos subcasos:1. Inserción de un nodo menor que el raíz de I.2. Inserción de un nodo mayor que el raíz de I.

INSERCIÓN EN AVLCaso C: Ejemplo

1. Se produce al insertar un nodo de clave 1 ó 3. Este índice es menor que el nodo raíz del subárbol izquierdo (4). La rotación a llevar a cabo para reequilibrar el árbol sería una rotación simple izquierda sobre el nodo raíz del árbol desequilibrado: el 8.

94

2. Se produce al insertar un nodo de clave 5 ó 7. Este índice es mayor que el nodo raíz del subárbol izquierdo (4). La rotación a llevar a cabo sería una rotación doble izquierda-derecha sobre el nodo raíz del árbol desequilibrado.

95

Diseño e implementaciónde árboles AVL

• INSERCIÓN: (tratamiento rotaciones)• Inserción de las claves 68, 45, 29:

• Movimiento de los punteros: Rotación I

(1) n^.iz := n1^.de;(2) n1^.de := n;(3) n := n1

nil(1)

96

Diseño e implementaciónde árboles AVL

• INSERCIÓN: (tratamiento rotaciones)• Inserción de las claves 75 y 90:

• Movimiento de los punteros: Rotación D

(1) n^.de := n1^.iz;(2) n1^.iz := n;(3) n := n1

nil(1)

97

Diseño e implementaciónde árboles AVL

• INSERCIÓN: (tratamiento rotaciones)• Inserción de la clave 70:

• Movimiento de los punteros: Rotación DI

(1) n1^.iz := n2^.de;(2) n2^.de := n1;(3) n^.de := n2^.iz;(4) n2^.iz := n;(5) n := n2

(3)

nil

98

Diseño e implementaciónde árboles AVL

• INSERCIÓN: (tratamiento rotaciones)• Inserción de la clave 34:

• Movimiento de los punteros: Rotación ID

(1) n1^.de := n2^.iz;(2) n2^.iz := n1;(3) n^.iz := n2^.de;(4) n2^.de := n;(5) n := n2 (3)

nil(1)

nil

99

Diseño e implementaciónde árboles AVL

• INSERCIÓN:function EsVacio (R: tArbolE): boolean;beginEsVacio:= (R = nil)

end;

function Crear (Clave: tInfo): tArbolE;var n: tArbolE;beginnew (n);with n^ dobegin

info:= Clave;iz := nil;de := nil;fe := 0 {propio de un nodo hoja}

end;Crear := n

end;

Diseño e implementaciónde árboles AVL

100

• INSERCIÓN:

procedure rsi (var n: tArbolE; n1: tArbolE);begin(1) n^.iz := n1^.de;(2) n1^.de := n;if n1^.fe = -1 thenbegin{Si la rotación es por inserción se cumple}

n^.fe := 0;n1^.fe := 0

endelse begin {n1^.fe=0}

n^.fe := -1;n1^.fe := 1

end;(3) n := n1;end;

Los factores de equilibrio se incrementan en uno si se fue por la rama derecha, se decrementa en 1 si se fue por la rama izquierda.

Ajuste del factor de equilibrio

101

Diseño e implementaciónde árboles AVL

• INSERCIÓN:

procedure rdid (var n: tArbolE; n1: tArbolE);var n2: tArbolEbeginn2 := n1^.de;(3) n^.iz := n2^.de;(4) n2^.de := n;(1) n1^.de := n2^.iz;(2) n2^.iz := n1;if (n2^.fe = 1) then n1^.fe := -1else n1^.fe := 0;if (n2^.fe = -1) then n^.fe :=1else n^.fe := 0;n2^.fe := 0;(5) n := n2;

end;

Ajuste del factor de equilibrio

102

Diseño e implementaciónde árboles AVL

• INSERCIÓN:

procedure rsd (var n: tArbolE; n1: tArbolE);begin(1) n^.de := n1^.iz;(2) n1^.iz := n;if n1^.fe = 1 thenbegin {Si la rotación es por

inserción se cumple}n^.fe := 0;n1^.fe := 0

endelse begin {n1^.fe=0}n^.fe := 1;n1^.fe := -1

end;(3) n := n1;

end;

Ajuste del factor de equilibrio

103

Diseño e implementaciónde árboles AVL

• INSERCIÓN:

procedure rddi (var n: tArbolE; n1: tArbolE);var n2: tArbolEbeginn2 := n1^.iz;(3) n^.de := n2^.iz;(4) n2^.iz := n;(1) n1^.iz := n2^.de;(2) n2^.de := n1;if (n2^.fe = 1) then n^.fe := -1else n^.fe := 0;if (n2^.fe = -1) then n1^.fe :=1else n1^.fe := 0;n2^.fe := 0;(5) n := n2;

end;

104

Diseño e implementación de árboles AVL• INSERCIÓN:

procedure InsertarE (var r: tArbolE; var hh: boolean; Clave: tInfo);

var n1: tArbolE;beginif EsVacio (r) then {se ha llegado a nodo hoja}beginr := Crear (Clave); hh := true {la altura del árbol ha crecido}

end;else if (Clave < r^.info) then {Seguimos por la izquierda}

beginInsertarE (r^.iz, hh, Clave);if hh then {decrementar en 1 Fe porque se insertó porcase r^.fe of rama izquierda}1: begin

r^.fe := 0; hh := falseend;

0: r^.fe := -1;-1: begin {Debe valer –2. Desequilibrio izquierda}

n1 := r^.iz;if (n1^.fe = -1) then rsi (r, n1) {desequilibrio izq}else rdid (r, n1); {n1^.fe = 1}hh := false

endend; {case}

end {if}

105

Diseño e implementación de árboles AVL• INSERCIÓN:

else if (Clave > r^.info) then {Seguimos por la derecha}begin

InsertarE (r^.de, hh, clave);if hh then {incrementar en 1 Fe porque se insertó porcase r^.fe of rama derecha}-1: begin {se reequilibra solo}

r^.fe := 0; hh := falseend;

0: r^.fe := 1;1: begin {Debe valer 2. Desequilibrio derecha}

n1 := r^.de;if (n1^.fe = 1) then rsd (r, n1) {desequilibrio dcha}else rddi (r, n1);hh := false

endend; {case}

end {if}else begin {Clave = r^.info}

writeln (‘No está previsto insertar claves repetidas’);hh := false

endend;

106

SUPRIMIR EN AVL• Sigue la estrategia del algoritmo de supresión

en árboles binarios de búsqueda.

• Al suprimir un nodo con cierta clave, el árbol resultante debe seguir siendo un árbol equilibrado.

• Una vez eliminado un nodo siguiendo los criterios ABB, se regresa por el camino calculando los nuevos factores de equilibrio (Fe).

• Si en alguno de los nodos se viola el criterio de equilibrio debe restaurarse el mismo, teniendo en cuenta que pueden producirse más de una rotación en el retroceso.

• En los procedimientos el argumento booleanhh, será activado cuando la altura del árbol disminuya por eliminación de nodo o reestructuración del subárbol.

107

SURPIMIR EN AVL• Casos en la reestructuración:Caso A: Eliminar el nodo con clave 42

Rotación I, porque n^.fe := -2 y n1^.fe < = 0

108

SUPRIMIR EN AVL• Casos en la reestructuración:Caso B: Eliminar el nodo con clave 21

Rotación DI, porque n^.fe := 2 y n1^.fe < 0

El Fe del nodo visitado disminuye en 1 si la eliminación se hizo por su rama derecha y se incrementa en 1 si la eliminación se hizo por su rama izquierda.

109

SUPRIMIR EN AVL• Casos en la reestructuración:Caso C: Eliminar el nodo con clave 25

Rotación D, porque n^.fe := 2 y n1^.fe >= 0

110

SUPRIMIR EN AVL• Casos en la reestructuración:Caso B: Reestructurar 65:

Rotación DI, porque n^.fe := 2 y n1^.fe < 0

111

Diseño e implementaciónde árboles AVL

• SUPRIMIR:procedure EquilibrarI (var n: tArbolE; var hh:var n1: tArbolE; boolean);begincase n^.fe of-1: n^.fe := 0;0 : begin

n^.fe := 1; hh := falseend;

1: begin {Hay que restaurar el equilibrio}n1:= n^.de;if n1^.fe >=0 thenbeginif n1^.fe = 0 then hh := false; {no disminuye h}rsd (n, n1)

endelse rddi (n, n1)

end;end

end;

112

Diseño e implementaciónde árboles AVL

• SUPRIMIR:procedure EquilibrarD (var n: tArbolE; var hh:var n1: tArbolE; boolean);begincase n^.fe of1 : n^.fe := 0;0 : begin

n^.fe := -1; hh := falseend;

-1: begin {Hay que restaurar el equilibrio}n1:= n^.iz;if n1^.fe <=0 thenbeginif n1^.fe = 0 then hh := false; rsi (n, n1)

endelse rdid (n, n1)

end;end

end;

113

Diseño e implementación de árboles AVL

• SUPRIMIR:

procedure SuprimirE (var r: tArbolE; var hh: boolean; Clave: tInfo);

var q: tArbolE;procedure bor (var d: tArbolE; var hh: boolean);beginif d^.de <> nil thenbegin

bor (d^.de,hh);if hh then EquilibrarD (d, hh);

endelse begin

q^.info := d^.info;q := d;d := d^.iz;hh := true

endend;

114

Diseño e implementación de árboles AVL

• SUPRIMIR:begin {Suprimir}if not EsVacio(r) then

if Clave < r^.info thenbeginSuprimir (r^.iz, hh, Clave);if hh then EquilibrarI (r, hh)

endelse if Clave > r^.info then

beginSuprimir (r^.de, hh, Clave);if hh then EquilibrarD (r, hh)

endelse begin {Ha sido encontrado el nodo}

q := r;if q^.de = nil thenbeginr := q^.iz; hh:= true {Disminuye la altura}

end (Sigue)

Diseño e implementación de árboles AVL

• SUPRIMIR:else if q^.iz = nil then

beginr := q^.de; hh := true

endelse begin

bor ( q^.iz, hh);if hh then EquilibrarI (r, hh)end

dispose (q);end {else encontrar nodo}

end;

115

116

Universidad de ValladolidDepartamento de informática

Campus de Segovia

Estructura de datosTema 5:Otros árboles

117

ÍNDICE

Tercera parte:• Árboles generales• Bosques• Árboles enhebrados

118

ÁRBOLES GENERALES• Un árbol de otro grado se puede transformar

a binario.

• Pasos: a) Quedarse con el enlace al hijo situado más a la izquierda de cada nodo.b) El hermano derecho más próximo se sitúa como subárbol derecho del hermano izquierdo.

119

ÁRBOLES GENERALES

1.

2. 3. El nodo raíz es A

120

BOSQUES• Un bosque es un conjunto de dos o más

árboles disjuntos.• Para poderse transformar a un árbol

binario, los árboles disjuntos tienen que estar ordenados.

• Pasos:a) Transformar cada árbol del bosque en binario según el criterio de transformación de árboles generales.b) Situar el nodo raíz de cada árbol como subárbol derecho del árbol más situado a su izquierda.

121

BOSQUESBosque:

Árbol binario:

122

BOSQUES• Recorrido preorden:

a) Visitar la raíz del primer árbol.b) Recorrer los subárboles del primer árbol (en preorden).c) Recorrer los árboles restantes (en preorden).Equivale a recorrer en preorden el árbol binario correspondiente.

Resultado: A-B-C-D-E-F-G-H-I

123

BOSQUES• Recorrido postorden:

a) Recorrer los subárboles del primer árbol (en postorden).b) Visitar la raíz del primer árbol.c) Recorrer los árboles restantes (en postorden).Equivale a recorrer enorden el árbol binario.

Resultado: B-C-D-A-F-E-H-I-G

124

ÁRBOLES ENHEBRADOS• Una forma de aprovechar los nodos a nil de un

árbol binario consiste en utilizarlos como apuntadores a otros nodos del árbol.

• A estos punteros se les llama hebras:a) El puntero derecho de un nodo hoja apunta al nodo sucesor del árbol en el recorrido enorden.b) El puntero izquierdo apunta al nodo predecesor.

125

ÁRBOLES ENHEBRADOS• Para distinguir los hijos de las hebras,

modificamos la estructura del árbol binario.

• Se introducen dos campos booleanos que indican si el puntero es un enlace a un hijo o a una hebra:

typetipoInfo = ...;tArbolEn=^Nodo;Nodo = record

info: tipoInfo;hiz, hde: boolean;iz, de: tArbolEn

end;

• Así si hiz ó hde valen true, esto hace que iz y de sean hebras.

126

ÁRBOLES ENHEBRADOS• Se incluye un nodo cabecera que no tiene

información. Su estructura es: