• Like
Arboles
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

Arboles

  • 414 views
Published

 

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
414
On SlideShare
0
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
19
Comments
0
Likes
0

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. INGENIERIA INFORMATICAAsignatura: Estructura de Datos AvanzadaTema: Árboles
  • 2. Tema 3: ÁrbolesContenido• Definición de árbol• Árboles Binarios• Recorridos en árboles binarios• Árboles de búsqueda: • Árboles lexicográficos • Árboles hilvanados• Implementación en un lenguaje de programación
  • 3. Tema 3: ÁrbolesContenido• Árboles generales• Transformación de árboles generales en binarios• Implementación en un lenguaje de programación• Colocación secuencial de árboles
  • 4. ibl io gr afí a Bibliografía B• Data Structures / Algorithms in Java. Robert Lafore. Páginas: 280-370• Thinking in Java. Páginas: 395-445.• Aprenda Java como si estuviera en primero. Páginas: 135-139.• Aprenda Java en 21 días. Páginas: 135-151.• El C++. Lenguaje de Programación. Bjarne Stroustrup. Páginas 143-180 :.
  • 5. ObjetivosConozcan las estructuras de datos arbóreas y lasformas de trabajar con ellas en la solución deproblemas de mediana complejidad
  • 6. IntroducciónEstructuras de datos estudiadas:Listas lineales y sus variantes.Las relaciones entre los nodos de información sonlineales.Todos los nodos tienen un único antecesor, exceptoel primero que no tiene antecesor.•Todos los nodos tienen un único sucesor, excepto elúltimo que no tiene sucesor.
  • 7. Introducción ? ¿Qué estructura de datos se debe utilizar para representar estructuras jerárquicas o taxonómicas?Ejemplo: Director SubDir1 SubDir2 SubDir3J´Dpto1 J´Dpto2 J´Dpto3 J´Dpto4 J´Dpto5
  • 8. Definición de ÁrbolUn árbol (tree) es un T.D.A. que consta de un Aconjunto finito T de nodos y una relación R(paternidad) entre los nodos tal que: B C• Hay un nodo, especialmente designado, llamado laraíz del árbol T. A G D E F• Los nodos restantes, excluyendo A raíz, son la B Cparticionados en m (m ≥ 0) conjuntos disjuntos T1, B CT2, ..., Tm, cada uno de los cuales es, a su vez, un E Gárbol, llamado subárbol de la raíz del árbol T. D F• A los nodos que no son D de F G raíces E otros subárbolesse les denomina hojas del árbol T, o sea, no tienensucesores o hijos.
  • 9. Definición de ÁrbolSi n es un nodo y A1, A2, A3, A4, A5, …, Ak son árbolescon raíces n1, n2, n3, n4,…, nk . Se puede construir unnuevo árbol haciendo que n se constituya en padrede los nodos n1, n2, n3, n4,…, nk.En dicho árbol, n es la raíz y A1, A2, A3, A4, A5, …, Akson los subárboles de la raíz.Los nodos n1, n2, n3, n4,…, nk reciben el nombre dehijos del nodo n.
  • 10. Aclaraciones• Si el conjunto finito T de nodos del árbol es vacío, entonces se trata de un árbol vacío.• En esta estructura existe sólo un nodo sin padre, que es la raíz del árbol.• Todo nodo, a excepción del nodo raíz, tiene uno y sólo un padre.• Los subárboles de un nodo son llamados hijos.
  • 11. Ejemplos A • Padre de C: A • Padre de E: B B C • Padre de G CD E F G • Padre de A: NO • Hijos de A: B C • Hijos de C: F G • Hijos de F: NO
  • 12. Aclaraciones• Para todo nodo k, distinto de la raíz, existe una única secuencia de la forma: –k0, k1, k2, k3, ..., kn, donde k0=raíz 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 raíz de otro subárbol.
  • 13. Ejemplos A Secuencias • de A a G B C • de A a ED E F G • de A a F C es sucesor de A y F es sucesor de C
  • 14. Otras definicionesGrado de un nodo: cantidad de hijos de un nodo.Grado de un árbol al mayor de los grados de todossus nodos.Nodo hoja a un nodo sin hijos o con grado = 0.Nodo rama a un nodo que tiene hijos, o sea, a la raízde un subárbol.
  • 15. Ejemplos A Grado • de A: 2 B C • de E: 3 • de G: 1D E F G • de J: 0 Grado del árbol: 3 H I J K Nodos hojas: D, H, I, J, F, K Nodos ramas: A, B, C, E, G
  • 16. Otras definicionesNivel de un nodo al nivel de su padre más uno. Pordefinición, la raíz del árbol tiene nivel 0. Estadefinición es recursiva.
  • 17. Ejemplos A Nivel de A: 0 B C de E: 2D E F G 1 de B: de I: 3 H I de G: 2
  • 18. Otras definicionesÁrbol completo de nivel n a un árbol en el quecada nodo de nivel n es una hoja y cada nodo denivel menor que n tiene, al menos, un subárbol novacío.
  • 19. Ejemplos A A B C B CD E F G D EÁrbol completo de nivel 2 Árbol no completo de nivel 2Cada nodo del nivel n es Un nodo del nivel n-1 es unauna hoja hoja
  • 20. Otras definicionesPadre de un nodo al nodo raíz del subárbol máspequeño que contiene a dicho nodo y en el cual élno es raíz.Hijo de un nodo al (los) nodo(s) raíz(ces) de uno desus subárboles.Predecesor de un nodo al nodo que le antecede enun recorrido del árbol.Hermano de un nodo a otro nodo hijo de su padre.
  • 21. Ejemplos A • Padre de G: C B C F G • Hijos de C: E • Hermanos de I: H JD E F G H I J
  • 22. Otras definicionesÁrbol ordenado a todo árbol para el que seconsidera el orden relativo de los sucesores osubárboles de cualquier nodo. Es decir, en un árbolordenado se habla de primero, segundo o último hijode un nodo en particular. El primer hijo de un nodode un árbol ordenado es denominado el hijo mayorde ese nodo y el último hijo es denominado elmenor.El Árbol es ordenado si al intercambiar el ordenrelativo de los subárboles de un nodo, representauna situación semánticamente diferente.
  • 23. Ejemplos: Árbol genealógico de María (sin los hermanos) María Juan Luisa José Elsa Pedro LisaEl árbol es ordenado• El primer subárbol corresponde al padre.• El segundo subárbol a la madre.
  • 24. Otras definicionesÁrbol orientado a un árbol para el cual no interesael orden relativo de los sucesores o subárboles decualquier nodo, ya que sólo se tiene en cuenta laorientación de los nodos.Ejemplo:La estructura organizativa de una empresa, dondeno es importante el orden de los subdirectores a lahora de representarlos en el árbol.En la solución de problemas informáticos, los másutilizados son los árboles ordenados.
  • 25. Otras definicionesUna floresta es una colección de dos o más árbolesdisjuntos.Aclaraciones:• Disjuntos significa que no hay nodos en comúnentre dos árboles cualesquiera de la misma.• De un árbol se obtiene una floresta al quitarle laraíz, si tiene dos hijos o más.• De una floresta se obtiene un árbol al añadir unnodo que sea raíz de todos los árboles que laconforman.
  • 26. Ejemplos A C B B B E G D E F GD F H J H I J I Es un árbol Es una floresta NO es una floresta
  • 27. Definición de Árbol BinarioUn árbol binario (en inglés binary tree) es un árbolordenado de, a lo sumo, grado 2.Aclaraciones:• A lo sumo grado 2 significa que cada nodo tienecomo máximo dos hijos, o sea, dos subárboles.• Al ser ordenado el árbol, importa el orden de lossubárboles, es decir, que será necesario especificarde cada nodo cuál es el hijo izquierdo y cuál el hijoderecho.
  • 28. Ejemplo María Juan Luisa José Elsa Pedro LisaEl árbol genealógico es un árbol binario.• Cada nodo tiene dos hijos• Es significativo el orden de los subárboles.
  • 29. Árbol Binario: CaracterísticasCada nodo del árbol binario contiene: • Una referencia a su información. • Un apuntador a su hijo izquierdo. • Un apuntador a su hijo derecho. InformaciónHijo Izquierdo Hijo Derecho
  • 30. Recorridos de un Árbol BinarioLos recorridos se clasifican de acuerdo al momentoen que se visita la raíz del árbol y los subárbolesizquierdo y derecho.Existen tres recorridos: • Recorrido en Preorden • Recorrido en orden simétrico o inorden • Recorrido en orden final o Postorden
  • 31. Recorrido en Preorden2. Visitar la raíz.4. Recorrer subárbol izquierdo en preorden.6. Recorrer subárbol derecho en preorden.
  • 32. Recorrido en Preorden A B C D E F GRecorrido: A B D E C F G2. Raíz.3. Subárbol izquierdo en preorden.4. Subárbol derecho en preorden.
  • 33. Recorrido en Simétrico2. Recorrer subárbol izquierdo en simétrico.4. Visitar la raíz.6. Recorrer subárbol derecho en simétrico.
  • 34. Recorrido en Simétrico A B C D E F GRecorrido D B E A F C G2. Subárbol izquierdo en simétrico.3. Raíz.4. Subárbol derecho en simétrico.
  • 35. Recorrido en Postorden2. Recorrer subárbol izquierdo en orden final.4. Recorrer subárbol derecho en orden final.6. Visitar la raíz.
  • 36. Recorrido en Simétrico A B C D E F GRecorrido D E B F G C A2. Subárbol izquierdo en orden final.3. Subárbol derecho en orden final.4. Raíz.
  • 37. Árbol Binario: Implementación 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};
  • 38. Árbol: Implementación 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();};
  • 39. Árboles de BúsquedaPermiten realizar operaciones (recorridos, búsqueda de un elemento, etc) de forma más eficiente.Hay dos momentos para la manipulación de un árbol: • La construcción del árbol. • El recorrido del árbol para realizar las operaciones requeridas según el problema a resolver.Existen dos tipos especiales de árboles:• Árboles lexicográficos.• Árboles hilvanados.
  • 40. Árboles LexicográficosUn árbol lexicográfico es un árbol binario que,recorrido en orden simétrico, permite obtener lainformación de los nodos en algún criterio deordenamiento.La técnica de construcción de un árbol lexicográficoconsiste en un proceso recursivo que va colocandolos nodos en el subárbol izquierdo o derecho delnodo raíz, según sea el criterio de ordenamientodeseado (ascendente o descendente).
  • 41. Árboles LexicográficosSiguiendo un ordenamiento ascendente:3. Se compara el nodo que se quiere insertar con la raíz del árbol. • Si es menor, se coloca en el subárbol izquierdo siguiendo el mismo proceso. • Si es mayor, se coloca en el subárbol derecho siguiendo el mismo proceso.
  • 42. Árboles Lexicográficos: EjemploÁrbol lexicográfico con ordenamiento ascendente.Lista: 2, 7, 1, 4, 5 Lista: 4, 7, 2, 1, 5 2 4 1 7 2 7 4 1 5 5Si se recorre en orden simétrico, se obtiene lainformación de sus nodos en orden ascendente: 1, 2,4, 5, 7 con independencia del orden de la lista original.
  • 43. ProblemasEl recorrido de árboles con programas recursivosresulta costoso ya que implica un gasto adicional dememoria y tiempo de ejecución. Para árboles muygrandes se puede desbordar el stack del sistemarelativamente pronto. ? ¿Cuál es la solución? Árboles hilvanados
  • 44. Árboles HilvanadosUn árbol hilvanado (o árbol entrelazado) es unárbol binario en el que cada hijo izquierdo de valornulo es sustituido por un enlace o hilván al nodo quele antecede en orden simétrico (excepto el primernodo en orden simétrico) y cada hijo derecho devalor nulo es sustituido por un enlace o hilván alnodo que le sigue en el recorrido en orden simétrico(excepto el último nodo en orden simétrico).
  • 45. Árboles HilvanadosAhora, un recorrido en orden simétrico se puedeimplementar sin necesidad de recursión.Sin embargo, se requiere que los nodos tengan ensu estructura algún atributo que permita sabercuándo un enlace es real y cuándo se trata de unhilván. En este caso es necesario un atributo paracada hijo.
  • 46. Árbol HilvanadoCada nodo del árbol hilvanado contiene: • Una referencia a su información. • Un apuntador a su hijo izquierdo. • Indicador Izquierdo (Verdadero o Falso). • Un apuntador a su hijo derecho. • Indicador Derecho (Verdadero o Falso). Información 5Indicador Izquierdo (T) T T Indicador Derecho (T) Hijo Izquierdo Hijo Derecho
  • 47. Árboles Hilvanados 5 Recorrido Simétrico: T T 1, 3, 4, 5, 6, 8, 9 3 8 T T T T 1 4 6 9 NULLNULL T F F F F F F T
  • 48. Construyendo Árboles Hilvanados 1. Se coloca el nodo raíz del árbol Si el nodo a insertar es el hijo izquierdo del nodo N:•Se pone como hijo izquierdo del nodo a insertar a loque era el hijo izquierdo del nodo N.•Se pone como hijo derecho del nodo a insertar alnodo N.•Se pone como hijo izquierdo del nodo N al nodo a
  • 49. 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 loque era el hijo derecho del nodo N.• Se pone como hijo izquierdo del nodo a insertar alnodo N.• Se pone como hijo derecho del nodo N al nodo ainsertar.
  • 50. Construyendo Árboles Hilvanados A A T T NULL NULL D B DB T T F F T C E NULL NULL F C E F F T F T F NULL F F
  • 51. Árbol Hilvanado: Implementación en C++class TThreadedTreeNode : public TBinTreeNode{private: bool aIsLeft; // Indicador Izquierdo bool aIsRight; // Indicador Derechopublic: TThreadedTreeNode(void* pInfo): TBinTreeNode(pInfo) { aIsLeft = false; aIsRight = false;}};
  • 52. Árboles BalanceadosLa búsqueda en un árbol lexicográfico puedeconvertirse en una búsqueda secuencial. Estosucede porque el árbol no está balanceado, es decirlos nodos no están distribuidos uniformemente y sehan insertado todos los nodos en profundidad.Esto podría ser salvado si se utilizara un árbolbalanceado que al insertar toma en cuenta lacantidad de niveles del árbol y distribuye los nodosuniformemente.
  • 53. Árboles BalanceadosLos árboles balanceados (B-Tree) son árboles enlos que cada nodo tiene entradas del mismo tipo.Un árbol balanceado no es un árbol de búsquedabinario, pues cada nodo puede tener más de doshijos.
  • 54. Árboles AVLUn árbol AVL es un árbol binario de búsqueda en elque las alturas de los subárboles izquierdo yderecho de cualquier nodo se diferencian a lo sumoen uno.La búsqueda es similar a como se hace en un árbolbinario de búsqueda (lexicográficos), pero lainserción y la eliminación deben considerar lapropiedad del balance.
  • 55. Árboles Generales Director SubDir1 SubDir2 SubDir3J´Dpto1 J´Dpto2 J´Dpto3 J´Dpto4 J´Dpto5 ? ¿La estructura anterior se puede representar con un árbol binario?
  • 56. Árboles GeneralesSon árboles cuyo grado es mayor que dos. ? ¿Cómo representarlos?
  • 57. Árboles Generales Por cada nodo: la información y una lista de1 referencias a cada uno de sus hijos.• Secuencial: Se pierde espacio, cada nodo tieneun agrado diferente.• Enlazada: la manipulación de la lista de hijos sehace difícil.
  • 58. Árboles Generales2 Transformar el árbol general en binarioCada nodo tiene en su enlace izquierdo a su primerhijo en el general y a la derecha de un nodo van sushermanos en el general.Aclaraciones:• El árbol se convierte en binario donde el enlaceizquierdo representa al primer hijo (en el árbolgeneral) y el enlace derecho al siguiente hermano(en el árbol general).• El árbol es ordenado porque a la izquierda está suprimer hijo (si lo tiene) y a la derecha estarán sushermanos (si los tiene) con sus descendientes.
  • 59. Transformación de General en Binario A Árbol General A Árbol Binario del General B C D B CE F G H D 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.
  • 60. Transformación de General en Binario Floresta Árbol Binario A E A de la Floresta C G H B E B FD I J K L D C F G I HN - cantidad de árboles de la floresta. J• Si N=0 entonces el árbol binario es vacío. K• Si N>0 - raíz del binario es raíz del 1er árbol. L • Hijo izquierdo sus descendientes. • Hijo derecho, la raíz del 2do árbol.
  • 61. Árbol General: Implementación en C++class TGBinTreeNode: public TBinTreeNode{public: TGBinTreeNode(void* pInfo): TBinTreeNode(pInfo) {} bool IsLeaf() {return !aLeft;} int Degree();};
  • 62. Árbol General: Implementación en C++int TGBinTreeNode::Degree(){ int degree = 0; TBinTreeNode* cursor = Left(); while (cursor) { degree++; cursor = cursor->Right(); } return degree;}
  • 63. Árbol General: Implementación en C++class TGBinTree: public TBinTree{public: void* DeleteNode(TGBinTreeNode*); TGBinTreeNode* GetFather(TGBinTreeNode*); TGLinkedList* GetLeaves(); TGLinkedList* GetSons(TBinTreeNode*); bool InsertNode(TGBinTreeNode*, TGBinTreeNode*);};
  • 64. Colocación Secuencial de árboles? 1 ¿Se puede colocar secuencialmente un árbol? Si 2 ¿Cuándo colocar secuencialmente un árbol? Cuando debe recorrerse en múltiples ocasiones y no sufre frecuentes inserciones y/o eliminaciones. Ejemplo: una fórmula que debe ser evaluada muchas veces.
  • 65. Colocación Secuencial de Árboles ? 3 ¿Cómo colocar secuencialmente un árbol?Los métodos más conocidos son:• Almacenamiento en Preorden Secuencial.• Almacenamiento en Orden Familiar.• Almacenamiento en Postorden Secuencial.
  • 66. Colocación en Preorden Secuencial1. Se transforma a binario2. Los nodos deben colocarse secuencialmente recorriendo al árbol en preorden.3. Por cada nodo se registra tres campos:INFO Árbol binario recorrido en PreordenENLDER Siguiente hermano en el árbol general, hijo derecho en el binario. Convención: -1 si no existeTERM Indica si el nodo es terminal (no tienen hijo en el general) y no tiene hijo izquierdo (en el binario).
  • 67. Colocación en Preorden Secuencial A A B B C D E CE F G H I J G D F H IENLDER -1 4 3 -1 6 -1 -1 8 9 -1 JINFO A B E F C G D H I JTERM F F T T F T F T T T
  • 68. Colocación en Preorden SecuencialAclaraciones:• Los hermanos se obtienen a través del enlacederecho.• Si un nodo no es terminal la siguiente posición de lalista secuencial está ocupada por su hijo. De locontrario, es familia de otro nodo (hermano o hijo).• Los subárboles están juntos, primero el padre yluego los hijos.
  • 69. Implementación 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;}};
  • 70. Colocación en Orden Familiar1. Se transforma a binario2. 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. Convención: -1 si no existeTERM Indica último hermano en el árbol general y enlace derecho en NULL en el binario. Indica el nodo final de cada familia
  • 71. Colocación en Orden Familiar A A B B C D E CE F G H I J G D F H IENLIZQ 1 8 4 -1 -1 -1 -1 -1 -1 7 JINFO A B C D H I J G E FFAM T F F T F F T T F T
  • 72. Colocación en Orden FamiliarAclaraciones:• El nodo raíz (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 están juntos secuencialmente.• El enlace izquierdo indica el subíndice del primer hijo y los otros a continuación son los hermanos hasta que FAM tome valor True.
  • 73. Implementación 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;}};
  • 74. Colocación en Postorden Secuencial1. Se transforma a binario.2. Los nodos deben colocarse secuencialmente recorriendo al árbol en simétrico.3. Por cada nodo se registra dos campos:INFO Árbol binario recorrido en SimétricoGRADO Grado del nodo
  • 75. Colocación en Postorden Secuencial A A B B C D E CE F G H I J G D F H IGRADO 0 0 2 0 1 0 0 0 3 3 JTERM E F B G C H I J D A
  • 76. Colocación en Postorden SecuencialAclaraciones:• Cada padre del árbol general está precedido de sus hijos, por tanto, es fácil encontrar el subárbol izquierdo de cada nodo del árbol binario. Se puede encontrar si recorremos la representación secuencial comenzando por el último elemento teniendo en cuenta el grado.• Notar que si después 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.
  • 77. Implementación 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;}};