Arboles

39
ESTRUCTURAS DE DATOS II CAPITULO 8 ÁRBOLES 201 2 O ctubre LUIS F. AGUAS B. 1

Transcript of Arboles

Page 1: Arboles

ESTRUCTURAS DE DATOS II

CAPITULO 8

ÁRBOLES

2012 Octu

bre

LUIS F. AGUAS B. 1

Page 2: Arboles

CAPITULO 8

1. Árboles en general Definiciones Terminología

2. Recorrido de árboles Postorden Preorden

3. Tipos de árboles Binarios AVL Multicamino Balanceado (B, B*, B+)

2012 Octu

bre

LUIS F. AGUAS B. 2

Page 3: Arboles

ÁRBOL: DEFINICIÓN

En computación, un árbol es un modelo abstracto de una estructura jerárquica.

Aplicaciones:OrganigramasSistemas de archivosAmbientes de programación

2012 Octu

bre

LUIS F. AGUAS B. 3

Computadores

ventas ReclamoManufactura

Laptops DesktopsLocal Internacional

Europa Asia Canada

Page 4: Arboles

ÁRBOLES EN GENERAL Y CON RAÍZ

En teoría de grafos, un árbol (tree) es un conjunto de nodos (vértices) y arcos (links, lines) conectando los nodos tal que: No existen ciclos cada dos nodos están conectados por un solo arco

En muchas aplicaciones informáticas, un nodo particular del el árbol es designado raíz (root), los otros nodos son arreglados por niveles a partir del nodo raíz.

2012 Octu

bre

LUIS F. AGUAS B. 4

Árbol general Un árbol con raíz

Nivel 0

Nivel 1

Nivel 2

root

Page 5: Arboles

TERMINOLOGÍA DE ÁRBOLES

Una estructura de árbol es una colección de nodos, c/u con:

Puede tener uno o mas sucesores Tiene solo un predecesor, con excepción del nodo raíz.

El nodo primero o inicial de la estructura árbol es llamado raíz

Un nodo predecesor es llamado padre (parent) Un nodo sucesor es llamado hijo (children) Nodos con padre común son llamados hermanos (siblings) Un nodo sin hijos es llamado hoja (leaf) Un nodo que tiene hijos es llamado nodo interior Un nodo sin hijos es llamado nodo exterior Los nodos descendientes consisten en hijos, nietos hasta

llegar a las hojas. Los nodos ancestros consisten de padres, abuelos hasta

llegar a la raíz.

2012 Octu

bre

LUIS F. AGUAS B. 5

Page 6: Arboles

TERMINOLOGÍA DE ÁRBOLES

Un lado (edge or branch) es la línea que conecta un padre con el hijo.

Un camino (path) es la secuencia de lados que conectan un nodo con uno de sus descendientes

La longitud del camino (path length) es el número de lados en el camino.

La profundidad o nivel (depth o level) de un nodo es igual a la longitud de nodo a la raíz.

La profundidad de la raíz es cero El peso (height) de un árbol es igual a la longitud

del camino más largo. Un sub-árbol (subtree) es un árbol formado al

considerar un nodo como “raíz”. El nuevo árbol consiste de este nodo y su descendencia.

2012 Octubre LUIS F. AGUAS B. 6

Page 7: Arboles

PROPIEDAD VALOR

Numero de nodos 10

Peso 3

Nodo raíz H

Hojas A C J L M N

Nodos interiores H B F E

Nodos a nivel 2 A C J E

2012 Octubre LUIS F. AGUAS B. 7

Terminología de árboles

H

B F

A C J E

NL M

Page 8: Arboles

NODO DE ÁRBOL

La clase TreeNodeRepresenta un node de un árbolEs similar al Nodo de lista doble (left y right)

2012 Octu

bre

LUIS F. AGUAS B. 8

public class TreeNode{ private Object value; private TreeNode left; private TreeNode right; ...

Referencia al hijo izquierdo

Referencia al hijo derecho

Page 9: Arboles

LA CLASE TREENODE 2

2012 Octu

bre

LUIS F. AGUAS B. 9

... ... ... // Constructores:

public TreeNode (Object v) { value = v; left = null; right = null; }

public TreeNode (Object v, TreeNode lt, TreeNode rt) { value = v; left = lt; right = rt; }

// Métodos:

public Object getValue () { return value; } public TreeNode getLeft () { return left; } public TreeNode getRight () { return right; } public void setValue (Object v) { value = v; } public void setLeft (TreeNode lt) { left = lt; } public void setRight (TreeNode rt) { right = rt; }}

Page 10: Arboles

TREENODE EJEMPLO 1

2012 Octu

bre

LUIS F. AGUAS B. 10

public int countNodes (TreeNode root){ if (root == null) return 0; else return 1 + countNodes ( root.getLeft ( ) ) + countNodes ( root.getRight ( ) );}

Para root

Caso base

Page 11: Arboles

ÁRBOLES Y RECURSIÓN

La estructura árbol es recursiva por naturaleza, los lados derechos e izquierdo son árboles también.

2012 Octu

bre

LUIS F. AGUAS B. 11

public void traverse (TreeNode root) { if (root != null) { visit (root); for (... <each child of the root> ) traverse (< that child’s subtree>); } }

Page 12: Arboles

RECORRIDO PREORDEN

Preorden: primero visita la raíz, entonces atraviesa la izquierda, y luego atraviesa el subarbol derecho

2012 Octu

bre

LUIS F. AGUAS B. 12

private void traversePreorder (TreeNode root){ if (root != null) { visit (root.getValue());

traversePreorder (root.getLeft());

traversePreorder (root.getRight()); }}

A/ \

B C / \ D E

A B D E C

Page 13: Arboles

RECORRIDO POSORDEN

Posorden: primero atraviesa la izquierda entonces atraviesa el subarbol izquierdo, entonces visita la raíz.

2012 Octu

bre

LUIS F. AGUAS B. 13

private void traversePostorder (TreeNode root){ if (root != null) { traversePostorder (root.getLeft());

traversePostorder (root.getRight());

process (root.getValue()); }}

A/ \

B C / \ D E

D E B C A

Page 14: Arboles

RECORRIDO INORDEN

Inorden: primero atraviesa el subarbol izquierdo, entonces visita la raíz, entonces atraviesa el subarbol derecho

2012 Octu

bre

LUIS F. AGUAS B. 14

private void traverseInorder (TreeNode root){ if (root != null) { traverseInorder (root.getLeft());

process (root.getValue());

traverseInorder (root.getRight()); }}

A/ \

B C / \ D E

D B E A C

Page 15: Arboles

ÁRBOL CON ESTRUCTURAS NODO

2012 Octu

bre

LUIS F. AGUAS B. 15

B

A D

C

Page 16: Arboles

2012 Octu

bre

LUIS F. AGUAS B. 16

1 // Fig. 20.17: Tree.java2 // Declaration of class TreeNode and class Tree.3 package com.deitel.jhtp5.ch20;4 5 // class TreeNode declaration6 class TreeNode {7 8 // package access members9 TreeNode leftNode; 10 int data; 11 TreeNode rightNode; 12 13 // initialize data and make this a leaf node14 public TreeNode( int nodeData )15 { 16 data = nodeData; 17 leftNode = rightNode = null; // node has no children18 }19 20 // locate insertion point and insert new node; ignore duplicate values21 public synchronized void insert( int insertValue )22 {23 // insert in left subtree24 if ( insertValue < data ) {25 26 // insert new TreeNode27 if ( leftNode == null )28 leftNode = new TreeNode( insertValue );29

Nodo izquierdo y derecho

Si no se puede ingresar ir a derecho

Page 17: Arboles

2012 Octu

bre

LUIS F. AGUAS B. 17

30 else // continue traversing left subtree31 leftNode.insert( insertValue ); 32 }33 34 // insert in right subtree35 else if ( insertValue > data ) {36 37 // insert new TreeNode38 if ( rightNode == null )39 rightNode = new TreeNode( insertValue );40 41 else // continue traversing right subtree42 rightNode.insert( insertValue ); 43 }44 45 } // end method insert46 47 } // end class TreeNode48 49 // class Tree declaration50 public class Tree {51 private TreeNode root;52 53 // construct an empty Tree of integers54 public Tree() 55 { 56 root = null; 57 }58 59 // insert a new node in the binary search tree60 public synchronized void insertNode( int insertValue )61 {

Si el valor es mayor enotnces inserte al lado

derecho

Page 18: Arboles

2012 Octu

bre

LUIS F. AGUAS B. 18

62 if ( root == null )63 root = new TreeNode( insertValue ); // create the root node here64 65 else66 root.insert( insertValue ); // call the insert method67 }68 69 // begin preorder traversal70 public synchronized void preorderTraversal()71 { 72 preorderHelper( root ); 73 }74 75 // recursive method to perform preorder traversal76 private void preorderHelper( TreeNode node )77 {78 if ( node == null )79 return;80 81 System.out.print( node.data + " " ); // output node data82 preorderHelper( node.leftNode ); // traverse left subtree 83 preorderHelper( node.rightNode ); // traverse right subtree84 }85 86 // begin inorder traversal87 public synchronized void inorderTraversal()88 { 89 inorderHelper( root ); 90 }91

Recorrido en preorden

Page 19: Arboles

2012 Octu

bre

LUIS F. AGUAS B. 19

92 // recursive method to perform inorder traversal93 private void inorderHelper( TreeNode node )94 {95 if ( node == null )96 return;97 98 inorderHelper( node.leftNode ); // traverse left subtree99 System.out.print( node.data + " " ); // output node data100 inorderHelper( node.rightNode ); // traverse right subtree101 }102 103 // begin postorder traversal104 public synchronized void postorderTraversal()105 { 106 postorderHelper( root ); 107 }108 109 // recursive method to perform postorder traversal110 private void postorderHelper( TreeNode node )111 {112 if ( node == null )113 return;114 115 postorderHelper( node.leftNode ); // traverse left subtree 116 postorderHelper( node.rightNode ); // traverse right subtree117 System.out.print( node.data + " " ); // output node data118 }119 120 } // end class Tree

Recorrido inorden

Recorrido postorden

Page 20: Arboles

2012 Octu

bre

LUIS F. AGUAS B. 20

1 // Fig. 20.18: TreeTest.java2 // This program tests class Tree.3 import com.deitel.jhtp5.ch20.Tree;4 5 public class TreeTest {6 7 public static void main( String args[] )8 {9 Tree tree = new Tree();10 int value;11 12 System.out.println( "Inserting the following values: " );13 14 // insert 10 random integers from 0-99 in tree 15 for ( int i = 1; i <= 10; i++ ) {16 value = ( int ) ( Math.random() * 100 );17 System.out.print( value + " " );18 tree.insertNode( value );19 }20 21 System.out.println ( "\n\nPreorder traversal" );22 tree.preorderTraversal(); // perform preorder traversal of tree23 24 System.out.println ( "\n\nInorder traversal" );25 tree.inorderTraversal(); // perform inorder traversal of tree

Insertar 10 enteros en árbol

Recorrido preorden

Recorrido inorden

Page 21: Arboles

ÁRBOL IMPLEMENTACIÓN

2012 Octu

bre

LUIS F. AGUAS B. 21

26 27 System.out.println ( "\n\nPostorder traversal" );28 tree.postorderTraversal(); // perform postorder traversal of tree29 System.out.println();30 }31 32 } // end class TreeTest

Inserting the following values: 39 69 94 47 50 72 55 41 97 73  Preorder traversal39 69 47 41 50 55 94 72 73 97  Inorder traversal39 41 47 50 55 69 72 73 94 97  Postorder traversal41 55 50 47 73 72 97 94 69 39

Recorrido postorden

Page 22: Arboles

ÁRBOLES BINARIOS

Árboles binariosEstructuras de datos donde cada nodo tiene dos sucesores, a izquierda y a derecha.

Ejemplo Creación Inserción Borrado

Árbol balanceado: un árbol está balanceado cuando la altura de la trayectoria más corta hacia una hoja no difiere de la altura de la trayectoria más grande.

Inconveniente de los binarios: se desbalancean fácilmente.

2012 Octu

bre

LUIS F. AGUAS B. 22

Page 23: Arboles

ÁRBOLES AVL

Árboles AVLÁrbol binario balanceado en altura (BA(1)) en el que las inserciones y eliminaciones se efectúan con un mínimo de accesos.

Árbol balanceado en altura: Para cada nodo existe un límite en la diferencia que se

permite entre las alturas de cualquiera de los subárboles del nodo (BA(k)), donde k es el nivel de balance)

Ejemplos:

2012 Octu

bre

LUIS F. AGUAS B. 23

Page 24: Arboles

Características Estructura que debe ser

respetada Mantener árbol, rotaciones

restringidas a un área local del árbol Binario: profundos. Búsqueda:

Log2(N+1)

AVL: diferencia de 1. Búsqueda: 1.44 log2(N+2)

(búsqueda en el peor caso)

Árboles binarios paginados

Problemas de almacenamiento secundario, buffering, páginas de memoria, varios registros individuales, minimiza el número de accesos

Problema: construcción descendente, como se elige la raíz?, cómo va construyendo balanceado?

2012 Octu

bre

LUIS F. AGUAS B. 24

ÁRBOLES CARACTERÍSTICAS

Page 25: Arboles

ÁRBOLES MULTICAMINO Y B

Árboles multicaminoGeneralización de árboles binarios, c/nodo tiene k punteros y k-1 claves (o registros), disminuye la profundidad del árbol, Orden del árbol.

Árboles B (balanceados)Son árboles multicamino con una construcción especial en forma ascendente que permite mantenerlo balanceado a bajo costo.

2012 Octu

bre

LUIS F. AGUAS B. 25

Page 26: Arboles

ÁRBOLES B PROPIEDADES

Propiedades de un árbol B de orden M: Ningún nodo tiene más de M hijos C/nodo (menos raíz y los terminales) tienen como mínimo

[M/2] hijos La raíz tiene como mínimo 2 hijos (o sino ninguno) Todos los nodos terminales a igual nivel Nodos no terminales con K hijos contienen K-1 registros.

Los nodos terminales tienen: Mínimo [M/2] –1 registros Máximo M – 1 registros

Formato del nodo

2012 Octu

bre

LUIS F. AGUAS B. 26

PO R1 P1 R2 P2 R3 P3 R4 P4 R5 P5 Nro de registros

Page 27: Arboles

ÁRBOLES OPERACIONES

Definición: nodo adyacente hermano Dos nodos son adyacentes hermanos si tienen el mismo padre y son

apuntados por punteros adyacentes en el padre. Operaciones

Búsqueda Borrado Creación e inserción Modificación

2012 Octu

bre

LUIS F. AGUAS B. 27

Page 28: Arboles

ÁRBOLES: BÚSQUEDA

Búsqueda de información Comienza desde el nodo raíz

Busca la llave en el nodo Si no la localiza se toma el puntero anterior a la llave mayor Si no es puntero nulo se toma ese nodi y se repite del

principio. Si es un puntero nulo el elemento no se encuentra en el árbol.

Performance Orden M, # de nodos terminales N, N+1 punteros nulos. Accesos:

Mejor caso: 1 lectura Pero caso: h lecturas (con h altura del árbol)

2012 Octu

bre

LUIS F. AGUAS B. 28

Page 29: Arboles

ÁRBOLES: # LECTURAS

Como acotamos hNivel # mínimo de descendientes 1 2 2 2 * [M/2] 3 2 * [M/2] * [M/2]…………………………………………………. h 2 * [M/2]h-1

Relación entre h y # de nodos N+1 >= 2 * [M/2]h-1

h <= [ 1 + log[M/2] ((N+1)/2) ] M = 512 y N = 1000000 h <= 3.37 (4 lecturas encuentra un registro)

2012 Octu

bre

LUIS F. AGUAS B. 29

Page 30: Arboles

Algoritmo (iterativo)encontro := false (k llave)tomar la raízRepeat N nro de elementos nodo Case k = llave del registro encontro := true k < llave( R1) P := Po k > llave (Rn) P := Pn otherwise P := Pi (i/ Ri-1 < k <Ri) EndCase IF P not null then leer nodo apuntado por PUntil encontro or P null

Algoritmo (recursivo)orden M estruc. del registro Record contador llaves llaves (arreglo M-1 elem.) hijos (arreglo M elem.) EndFunction Busca (Nrr, llave,NRR_encon, Pos_enc) Si Nrr = nulo entonces devuelve (‘no encon’) sino lee nodo apuntado x NRR en página busca la llave en nodo; Pos:= Posición donde encuentra o debería estarla llave Si encontro llave entonces nrr_encon := Nrr (nodo con la

llave) pos_enc := pos (posición dentro de llave) devuelve (encontrada) sino {busco en el nivel inferior}

devuelve (busca( hijo[pos],llave, nrr_encon, pos_enc)) Fin S Fin SFin Function

2012 Octu

bre

LUIS F. AGUAS B. 30

ARBOLES ALGORITMOS

Page 31: Arboles

ÁRBOLES: INSERCIÓN

Inserción (creación) Los registros se insertan en un nodo Terminal Casos posibles

El registro tiene lugar en el nodo Terminal (no se produce overflow): solo se hacen reacomodamientos internos en el nodo

El registro no tiene lugar en el nodo Terminal (se produce overflow): el nodo se divide y los elementos se reparten entre los nodos, hay una promoción al nivel superior, y esta puede propagarse y generar una nueva raíz.

2012 Octu

bre

LUIS F. AGUAS B. 31

Page 32: Arboles

Algoritmo (iterativo){ reg.: reg a insertar fin: inserción finalizada encontro: elemento ya está P: puntero al nodo N_G: nodo sobredimensionado N : # reg }{busco la llave en el árbol}If encontro Then Informar llave repetida Else { insertar elemento } P := nil encontro := falso

Repeat IF nodo no esta lleno Then poner reg y reordenar encontro Else copiar el nodo en N_G insertar reg. en N_G reg:= centro de N_G nodo corr.:=1/2 N_G izq nodo nuevo:=1/2 N_G der If nodo raiz nuevo then generar nuevos punteros Until encontro

2012 Octu

bre

LUIS F. AGUAS B. 32

ÁRBOLES: INSERCIÓN

Page 33: Arboles

Algoritmo (recursivo)Funcion inserta (Nrr_Actual, llave, hijo_promo, llave_promo)Si Nrr_Actual = nulo entonces llave_promo := llave hijo_promo := nulo devuelve Promocion (promueve llave original y nulo) sino leer página de Nrr_acutal en pagina buscar llave en pagina pos := posicion donde deberia estar en llave Si encuentra llave entonces devuelve (error) valordevuelto := inserta(pagina, hijo[pos], llave, nrr_P_A, llave_P_a)

Si valordevuelto <> promocion entonces devuelve(valordevuelto) sino si hay espacio en pagina para

llave_p_a entonces insertar(llave_p_a, nrr_p_a en pagina) promovida abajo devuelve (no promocion) sino divide( llave_p_a, nrr_p_a, pagina, llave_promo, hijo_promo, página_nueva) escribe pagina en archivo en nrr_actual escribe pagina_nueva en hijo_promo devuelve promoción promociona Fin Si llave_promo, hijo_promofin funcion

2012 Octu

bre

LUIS F. AGUAS B. 33

ÁRBOLES: INSERCIÓN

Page 34: Arboles

Procedimiento Divide (llave_i, nrr_i, pagina, llave_promo, hijo_promo, pagina_nueva )

copiar pagina + llave a un nodo que pueda contener a todas las llaves.

insertar llave_i, nrr_i en los lugares correctos de la pagina

crear una nueva pagina para pagina_nueva

asignar a llave_promo el valor de la llave de enmedio de la pagina grande

asignar a hijo_d_promo el nrr de pagina_nueva

copiar las llaves y apuntadores que preceen a llave_promo en pagina

idem posteriores pagina_nuevafin procedimiento

Performance Mejor caso (sin overflow)

H lecturas 1 escritura

Peor caso (overflow hasta la raíz, aumenta en uno el nivel del árbol) H lecturas 2h+1 escrituras (dos por

nivel más la raíz) Estudios realizados

M = 10 25% divisiones M = 100 2% divisiones

2012 Octu

bre

LUIS F. AGUAS B. 34

DIRECTORIO

Page 35: Arboles

ÁRBOLES: ELIMINACIÓN

EliminaciónMejor caso: borra un elemento del nodo y no produce underflow, solo reacomodos ( # elementos >= [M/2]-1

Peor caso: se produce underflow, #elementos < [M/2] – 1

Eliminar Nodo Terminal Nodo no Terminal ( llevar a un nodo Terminal)

Dos soluciones Redistribuir concatenar

2012 Octu

bre

LUIS F. AGUAS B. 35

Page 36: Arboles

ÁRBOLES: REDISTRIBUIR

Redistribuir Cuando un nodo tiene underflow puede trasladarse llaves de un nodo

adyacente hermano (en caso que este tenga suficientes elementos) Concatenación:

Si un nodo adyacente hermano está al mínimo (no le sobra ningún elemento) no se puede redistribuir, se concatena con un nodo adyacente disminuyendo el # de nodos (y en algunos casos la altura del árbol)

2012 Octu

bre

LUIS F. AGUAS B. 36

Page 37: Arboles

ÁRBOLES: PERFORMANCE

Performance Mejor caso (borra de un nodo Terminal)

H lecturas 1 escritura

Peor caso (concatenación lleva a decrementar el nivel del árbol en 1) 2h – 1 lecturas H + 1 escrituras

2012 Octu

bre

LUIS F. AGUAS B. 37

Page 38: Arboles

Algoritmo de eliminación (iterativo){ fin: indica fin del borrado n_g:nodo tamaño mayor al normal ady: nodo adyacente hermano reg: reg. a borrar}{buscar reg en el árbol }If reg no está en un nodo terminal then buscar el sucesor de reg en un nodo terminal intercalar reg con su sucesor { eliminación de reg } fin := falsorepeat remover reg y el puntero asociado If nodo corriente > [M/2] -1 elem. then fin := true else if es posible redistribuir then {redistribuir}{ady.>min.}

copiar ady y nodo actual en n_g dividir n_g promover nueva llave a padre armar nodo actual y ady con la

mitad de n_g en c/u fin := true else {concatenar} elegir el mejor ady para concat. poner ady y nodo actual juntos y acoplarle elemnto nodo padre eliminar nodo que sobra y producir enganches nuevo reg elemento que bajo nodo padra y que debemos eliminarUntil finIF no hay registro en la raiz then nueva raiz nodo corriente liberar vieja raíz

2012 Octu

bre

LUIS F. AGUAS B. 38

ÁRBOLES: ELIMINACIÓN

Page 39: Arboles

CAPITULO 8

PREGUNTAS Y RESPUESTAS

2012 Octu

bre

LUIS F. AGUAS B. 39