SlideShare ist ein Scribd-Unternehmen logo
1 von 78
Downloaden Sie, um offline zu lesen
PNFSI

   Asignatura: Desarrollo de Software


   Tema: Árboles




Ing. Zamantha González Díaz             Abril, 2008
Tema 3: Árboles
Contenido
• 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
Tema 3: Árboles
Contenido
• Árboles generales
• Transformación de árboles generales en binarios
• Implementación en un lenguaje de programación
• Colocación secuencial de árboles
Objetivos
Conozcan las estructuras de datos arbóreas y las
formas de trabajar con ellas en la solución de
problemas de mediana complejidad
Introducción

• Las relaciones entre los nodos de información 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.
Introducción
 ?
          ¿Qué estructura de datos se debe utilizar
          para representar estructuras jerárquicas o
          taxonómicas?

Ejemplo:
                         Director


     SubDir1              SubDir2           SubDir3



J´Dpto1      J´Dpto2      J´Dpto3     J´Dpto4    J´Dpto5
Definición de Árbol
Un árbol (tree) es un T.D.A. que consta de un
conjunto finito T de nodos y una relación R
(paternidad) entre los nodos tal que:
• Hay un nodo, especialmente designado, llamado la
raíz del árbol T.
                                 A

                            B           C


                        D       E   F       G
Definición de Árbol

• Los nodos restantes, excluyendo la raíz, son
particionados en m (m  0) conjuntos disjuntos T1,
T2, ..., Tm, cada uno de los cuales es, a su vez, un
árbol, llamado subárbol de la raíz del árbol T.

                                   A

                           B               C


                       D       E       F       G
Definición de Árbol
• A los nodos que no son raíces de otros subárboles
se les denomina hojas del árbol T, o sea, no tienen
sucesores o hijos.

                     A

             B               C


         D       E       F       G
Definición de Árbol

Si n es un nodo y A1, A2, A3, A4, A5, …, Ak son
árboles con raíces 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 raíz y A1, A2, A3, A4, A5, …, Ak
son los subárboles de la raíz.

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

            A               • Padre de C:   A
                            • Padre de E:   B
    B               C
                            • Padre de G    C

D       E       F       G   • Padre de A:   NO
                            • Hijos de A:   B    C
                            • Hijos de C:   F    G
                            • Hijos de F:   NO
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.
Ejemplos

                             Secuencias
            A
                             • de A a G
    B               C
                             • de A a E

        E       F        G   • de A a F
D
                              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 raíz
de un subárbol.
Ejemplos

            A               Grado
                              • de A:    2
    B               C         • de E:    3
                              • de G:    1
D       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
Otras definiciones
Nivel de un nodo al nivel de su padre más uno. Por
definición, la raíz del árbol tiene nivel 0. Esta
definición es recursiva.
Ejemplos

            A                 Nivel
                              de A:   0
    B               C
                              de E:   2
D       E       F       G     de B:   1
                              de I:   3
            H       I
                              de G:   2
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 subárbol no
vacío.
Ejemplos
            A                              A


    B               C              B            C


D       E       F       G      D       E

Árbol completo de nivel 2    Árbol no completo de nivel 2
Cada nodo del nivel n es     Un nodo del nivel n-1 es una
una hoja                     hoja
Otras definiciones
Padre de un nodo al nodo raíz del subárbol más
pequeño que contiene a dicho nodo y en el cual él
no es raíz.

Hijo de un nodo al (los) nodo(s) raíz(ces) de uno de
sus subárboles.

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

                        • Hermanos de I:    H   J
D       E       F   G


        H       I   J
Otras definiciones
Árbol ordenado a todo árbol para el que se
considera el orden relativo de los sucesores o
subárboles 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 subárboles de un nodo, representa
una situación semánticamente diferente.
Ejemplos: Árbol genealógico de María
                (sin los hermanos)

                       María

                Juan        Luisa


            José Elsa Pedro         Lisa

El árbol es ordenado
• El primer subárbol corresponde al padre.
• El segundo subárbol a la madre.
Otras definiciones
Árbol orientado a un árbol para el cual no interesa
el orden relativo de los sucesores o subárboles de
cualquier nodo, ya que sólo se tiene en cuenta la
orientación 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 solución de problemas informáticos, los más
utilizados son los árboles ordenados.
Otras definiciones
Una floresta es una colección de dos o más árboles
disjuntos.

Aclaraciones:
• Disjuntos significa que no hay nodos en común
entre dos árboles cualesquiera de la misma.
• De un árbol se obtiene una floresta al quitarle la
raíz, si tiene dos hijos o más.
• De una floresta se obtiene un árbol al añadir un
nodo que sea raíz de todos los árboles que la
conforman.
Ejemplos
            A

                C              B       B
    B


        E           G      D       E   F   G
D               F


        H           J              H   I   J
                I


    Es un árbol
    Es una floresta        NO es una floresta
Definición de Árbol Binario
Un árbol binario (en inglés binary tree) es un árbol
ordenado de, a lo sumo, grado 2.

Aclaraciones:
• A lo sumo grado 2 significa que cada nodo tiene
como máximo dos hijos, o sea, dos subárboles.
• Al ser ordenado el árbol, importa el orden de los
subárboles, es decir, que será necesario especificar
de cada nodo cuál es el hijo izquierdo y cuál el hijo
derecho.
Ejemplo

                       María

                Juan          Luisa


            José Elsa Pedro        Lisa


El árbol genealógico es un árbol binario.
• Cada nodo tiene dos hijos
• Es significativo el orden de los subárboles.
Árbol Binario: Características
Cada nodo del árbol binario contiene:

 • Una referencia a su información.

 • Un apuntador a su hijo izquierdo.

 • Un apuntador a su hijo derecho.

                          Información


Hijo Izquierdo           Hijo Derecho
Recorridos de un Árbol Binario
Los recorridos se clasifican de acuerdo al momento
en que se visita la raíz del árbol y los subárboles
izquierdo y derecho.

Existen tres recorridos:

   • Recorrido en Preorden

   • Recorrido en orden simétrico o inorden

   • Recorrido en orden final o Postorden
Recorrido en Preorden

1. Visitar la raíz.

2. Recorrer subárbol izquierdo en preorden.

3. Recorrer subárbol derecho en preorden.
Recorrido en Preorden

                           A

                   B               C


               D       E       F       G


Recorrido: A B D E C F G
1. Raíz.
2. Subárbol izquierdo en preorden.
3. Subárbol derecho en preorden.
Recorrido en Simétrico

1. Recorrer subárbol izquierdo en simétrico.

2. Visitar la raíz.

3. Recorrer subárbol derecho en simétrico.
Recorrido en Simétrico

                            A

                    B               C


                D       E       F       G



Recorrido D B E A F C G
1. Subárbol izquierdo en simétrico.
2. Raíz.
3. Subárbol derecho en simétrico.
Recorrido en Postorden


1. Recorrer subárbol izquierdo en orden final.

2. Recorrer subárbol derecho en orden final.

3. Visitar la raíz.
Recorrido en Postorden

                            A

                    B               C


                D       E       F       G



Recorrido D E B F G C A
1. Subárbol izquierdo en orden final.
2. Subárbol derecho en orden final.
3. Raíz.
Á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
};
Á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();
};
Árboles de Búsqueda
Permiten 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.
Árboles Lexicográficos
Un árbol lexicográfico es un árbol binario que,
recorrido en orden simétrico, permite obtener la
información de los nodos en algún criterio de
ordenamiento.

La técnica de construcción de un árbol lexicográfico
consiste en un proceso recursivo que va colocando
los nodos en el subárbol izquierdo o derecho del
nodo raíz, según sea el criterio de ordenamiento
deseado (ascendente o descendente).
Árboles Lexicográficos
Siguiendo un ordenamiento ascendente:

1. 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.
Á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
                5
Si se recorre en orden simétrico, se obtiene la
información 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 ejecución. Para árboles muy
grandes se puede desbordar el stack del sistema
relativamente pronto.

  ?   ¿Cuál es la solución?

          Á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 hilván al nodo que
le antecede en orden simétrico (excepto el primer
nodo en orden simétrico) y cada hijo derecho de
valor nulo es sustituido por un enlace o hilván al
nodo que le sigue en el recorrido en orden simétrico
(excepto el último nodo en orden simétrico).
Árboles Hilvanados
Ahora, un recorrido en orden simétrico se puede
implementar sin necesidad de recursión.

Sin embargo, se requiere que los nodos tengan en
su estructura algún atributo que permita saber
cuándo un enlace es real y cuándo se trata de un
hilván. En este caso es necesario un atributo para
cada hijo.
Árbol Hilvanado
Cada 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
                               5
Indicador Izquierdo (T)    T       T    Indicador Derecho (T)


          Hijo Izquierdo               Hijo Derecho
Á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




                                                                                           NULL
NULL




       T       F               F       F               F       F               F       T
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 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                              T       T
                           NULL                    NULL
            D               B                       D
B
                           T   T
                               F                   T   F

    C           E   NULL
                                           NULL

        F                          C                               E
                               F       F                       T
                                                               F       T



                                                           F           NULL
                                                       F       F
Árbol Hilvanado: Implementación 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 búsqueda en un árbol lexicográfico puede
convertirse en una búsqueda secuencial. Esto
sucede porque el árbol no está balanceado, es decir
los nodos no están distribuidos uniformemente y se
han insertado todos los nodos en profundidad.

Esto podría 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 búsqueda
binario, pues cada nodo puede tener más de dos
hijos.
Árboles AVL
Un árbol AVL es un árbol binario de búsqueda en el
que las alturas de los subárboles izquierdo y
derecho de cualquier nodo se diferencian a lo sumo
en uno.

La búsqueda es similar a como se hace en un árbol
binario de búsqueda (lexicográficos), pero la
inserción y la eliminación deben considerar la
propiedad del balance.
Árboles Generales
                    Director


    SubDir1         SubDir2           SubDir3



J´Dpto1   J´Dpto2   J´Dpto3     J´Dpto4   J´Dpto5


    ?
          ¿La estructura anterior se puede
          representar con un árbol binario?
Árboles Generales
Son árboles cuyo grado es mayor que dos.


 ?
      ¿Cómo representarlos?
Árboles Generales

    Por cada nodo: la información y una lista de
1
    referencias a cada uno de sus hijos.


• Secuencial: Se pierde espacio, cada nodo tiene
un agrado diferente.

• Enlazada: la manipulación de la lista de hijos se
hace difícil.
Á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 estarán sus
hermanos (si los tiene) con sus descendientes.
Transformación de General en Binario

            A   Árbol General           A       Árbol Binario
                                                del General
    B       C       D               B
                                            C
E       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.
Transformación de General en Binario
            Floresta                                       Árbol Binario
        A               E                          A       de la Floresta


            C           G   H             B            E
    B               F

D               I       J   K   L     D       C        F
                                                               G
                                               I                       H
N - 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.
Árbol General: Implementación en C++
class TGBinTreeNode: public TBinTreeNode
{
public:
  TGBinTreeNode(void* pInfo): TBinTreeNode(pInfo) {}
  bool IsLeaf() {return !aLeft;}
  int Degree();
};
Árbol General: Implementación en C++
int TGBinTreeNode::Degree()
{
  int degree = 0;
  TBinTreeNode* cursor = Left();
  while (cursor)
  {
    degree++;
    cursor = cursor->Right();
  }
  return degree;
}
Á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*);
};
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.
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.
Colocación 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      Árbol binario recorrido en Preorden
ENLDER    Siguiente hermano en el árbol general,
           hijo derecho en el binario.
           Convención: -1 si no existe
TERM      Indica si el nodo es terminal (no tienen hijo
          en el general) y no tiene hijo izquierdo (en
          el binario).
Colocación en Preorden Secuencial

            A                                               A

                                                    B
    B       C       D
                                            E               C
E       F   G   H       I       J                   G           D
                                                F
                                                            H
                                                                I
ENLDER -1       4   3 -1        6 -1 -1     8   9 -1                J
INFO        A B E F             C G D       H   I J
TERM        F   F   T       T   F   T   F   T T         T
Colocación en Preorden Secuencial

Aclaraciones:
• Los hermanos se obtienen a través del enlace
derecho.

• Si un nodo no es terminal la siguiente posición de la
lista secuencial está ocupada por su hijo. De lo
contrario, es familia de otro nodo (hermano o hijo).

• Los subárboles están juntos, primero el padre y
luego los hijos.
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;}
};
Colocación 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.
       Convención: -1 si no existe
FAM    Indica último hermano en el árbol general y
       enlace derecho en NULL en el binario. Indica
       el nodo final de cada familia
Colocación en Orden Familiar

            A                                               A

                                                    B
    B       C       D
                                            E               C
E       F   G   H       I       J                   G           D
                                                F
                                                            H
                                                                I
ENLIZQ      1   8 4 -1 -1 -1 -1 -1 -1
                    7                                               J
INFO        A B C D H I J G E F
FAM         T   F   F       T   F   F   T   T F         T
Colocación en Orden Familiar

Aclaraciones:
• 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.
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;}
};
Colocación en Postorden Secuencial

1. 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étrico
GRADO     Grado del nodo
Colocación en Postorden Secuencial

            A                                                   A

                                                        B
    B       C       D
                                            E                   C
E       F   G   H       I       J                       G           D
                                                    F
                                                                H
                                                                    I

GRADO       0   0   2       0   1   0   0       0   3       3           J
TERM        E F     B G C H             I   J       D A
Colocación en Postorden Secuencial

Aclaraciones:
• 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.
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;}
};

Weitere ähnliche Inhalte

Was ist angesagt? (20)

Aplicaciones de los árboles y grafos
Aplicaciones de los árboles y grafosAplicaciones de los árboles y grafos
Aplicaciones de los árboles y grafos
 
Árboles binarios, ABB y AVL
Árboles binarios, ABB y AVLÁrboles binarios, ABB y AVL
Árboles binarios, ABB y AVL
 
Normalización de Base de Datos
Normalización de Base de DatosNormalización de Base de Datos
Normalización de Base de Datos
 
Estructura de Datos - Unidad 4 Estructuras no lineales
Estructura de Datos - Unidad 4 Estructuras no linealesEstructura de Datos - Unidad 4 Estructuras no lineales
Estructura de Datos - Unidad 4 Estructuras no lineales
 
Diapositiva de prueba
Diapositiva de pruebaDiapositiva de prueba
Diapositiva de prueba
 
Estructura de Datos - Estructuras no lineales
Estructura de Datos - Estructuras no linealesEstructura de Datos - Estructuras no lineales
Estructura de Datos - Estructuras no lineales
 
Arboles con raiz
Arboles con raizArboles con raiz
Arboles con raiz
 
HA2NV50 EQ8-StarUML
HA2NV50 EQ8-StarUMLHA2NV50 EQ8-StarUML
HA2NV50 EQ8-StarUML
 
Teoria de grafos
Teoria de grafosTeoria de grafos
Teoria de grafos
 
Arboles Binarios y Arboles Binarios de Busqueda
Arboles Binarios y Arboles Binarios de BusquedaArboles Binarios y Arboles Binarios de Busqueda
Arboles Binarios y Arboles Binarios de Busqueda
 
Modelo Relacional (Base de Datos)
Modelo Relacional (Base de Datos)Modelo Relacional (Base de Datos)
Modelo Relacional (Base de Datos)
 
Arboles - estructura de datos
Arboles - estructura de datos Arboles - estructura de datos
Arboles - estructura de datos
 
Arboles v2
Arboles v2Arboles v2
Arboles v2
 
Arboles y grafos
Arboles y grafosArboles y grafos
Arboles y grafos
 
Tema grafos
Tema grafosTema grafos
Tema grafos
 
5. arboles binarios
5. arboles binarios5. arboles binarios
5. arboles binarios
 
Grafos
GrafosGrafos
Grafos
 
Estructura de datos lineales y no lineales
Estructura de datos lineales y no linealesEstructura de datos lineales y no lineales
Estructura de datos lineales y no lineales
 
Arboles
ArbolesArboles
Arboles
 
Teoria de Grafos. Conceptos básicos.
Teoria de Grafos. Conceptos básicos.Teoria de Grafos. Conceptos básicos.
Teoria de Grafos. Conceptos básicos.
 

Andere mochten auch

Estructura de datos
Estructura de datosEstructura de datos
Estructura de datosnukeeHE
 
Arboles AVL Rotaciones
Arboles AVL RotacionesArboles AVL Rotaciones
Arboles AVL RotacionesEvans Balcazar
 
Estructura de datos, pilas, árboles, colas, listas
Estructura de datos, pilas, árboles, colas, listasEstructura de datos, pilas, árboles, colas, listas
Estructura de datos, pilas, árboles, colas, listasGuiro Lin
 
Árboles AA
Árboles AAÁrboles AA
Árboles AAmarbmdj
 
ESTRUCTURAS DE DATOS FUNDAMENTALES
ESTRUCTURAS DE DATOS FUNDAMENTALESESTRUCTURAS DE DATOS FUNDAMENTALES
ESTRUCTURAS DE DATOS FUNDAMENTALESEvans Balcazar
 
Tecnicas de rotacion en arboles balanceados
Tecnicas de rotacion en arboles balanceadosTecnicas de rotacion en arboles balanceados
Tecnicas de rotacion en arboles balanceadosPEREZHROS
 
Arreglo De Discos Raid
Arreglo De Discos RaidArreglo De Discos Raid
Arreglo De Discos RaidAlex Avila
 
Pilas colas listas
Pilas colas listasPilas colas listas
Pilas colas listastazmania2
 
Arboles y Colas de Prioridad en Java
Arboles y Colas de Prioridad en JavaArboles y Colas de Prioridad en Java
Arboles y Colas de Prioridad en JavaLupitaOMG Garmendia
 
Algoritmos y Estructuras de Datos
Algoritmos y Estructuras de DatosAlgoritmos y Estructuras de Datos
Algoritmos y Estructuras de DatosStorti Mario
 
18 Arboles Como Estructura De Busqueda
18 Arboles Como Estructura De Busqueda18 Arboles Como Estructura De Busqueda
18 Arboles Como Estructura De BusquedaUVM
 
Clase 10 Estructuras De Datos Y Arreglos
Clase 10 Estructuras De Datos Y ArreglosClase 10 Estructuras De Datos Y Arreglos
Clase 10 Estructuras De Datos Y Arreglossalomonaquino
 
Estructuras de datos y tipos de datos abstractos
Estructuras de datos y tipos de datos abstractosEstructuras de datos y tipos de datos abstractos
Estructuras de datos y tipos de datos abstractosLuis Lastra Cid
 
Java pilas (Stacks) y colas (Queues)
Java pilas (Stacks) y colas (Queues)Java pilas (Stacks) y colas (Queues)
Java pilas (Stacks) y colas (Queues)Juan Astudillo
 

Andere mochten auch (20)

Estructura de datos
Estructura de datosEstructura de datos
Estructura de datos
 
Arbol aa
Arbol aaArbol aa
Arbol aa
 
Arboles Ordenados
Arboles OrdenadosArboles Ordenados
Arboles Ordenados
 
Arboles AVL Rotaciones
Arboles AVL RotacionesArboles AVL Rotaciones
Arboles AVL Rotaciones
 
Arboles multicamino
Arboles  multicaminoArboles  multicamino
Arboles multicamino
 
Estructura de datos, pilas, árboles, colas, listas
Estructura de datos, pilas, árboles, colas, listasEstructura de datos, pilas, árboles, colas, listas
Estructura de datos, pilas, árboles, colas, listas
 
Arboles
Arboles Arboles
Arboles
 
Árboles AA
Árboles AAÁrboles AA
Árboles AA
 
ESTRUCTURAS DE DATOS FUNDAMENTALES
ESTRUCTURAS DE DATOS FUNDAMENTALESESTRUCTURAS DE DATOS FUNDAMENTALES
ESTRUCTURAS DE DATOS FUNDAMENTALES
 
Tecnicas de rotacion en arboles balanceados
Tecnicas de rotacion en arboles balanceadosTecnicas de rotacion en arboles balanceados
Tecnicas de rotacion en arboles balanceados
 
Arreglo De Discos Raid
Arreglo De Discos RaidArreglo De Discos Raid
Arreglo De Discos Raid
 
colas de prioridad
colas de prioridad colas de prioridad
colas de prioridad
 
Tipos De Datos Abstractos
Tipos De Datos AbstractosTipos De Datos Abstractos
Tipos De Datos Abstractos
 
Pilas colas listas
Pilas colas listasPilas colas listas
Pilas colas listas
 
Arboles y Colas de Prioridad en Java
Arboles y Colas de Prioridad en JavaArboles y Colas de Prioridad en Java
Arboles y Colas de Prioridad en Java
 
Algoritmos y Estructuras de Datos
Algoritmos y Estructuras de DatosAlgoritmos y Estructuras de Datos
Algoritmos y Estructuras de Datos
 
18 Arboles Como Estructura De Busqueda
18 Arboles Como Estructura De Busqueda18 Arboles Como Estructura De Busqueda
18 Arboles Como Estructura De Busqueda
 
Clase 10 Estructuras De Datos Y Arreglos
Clase 10 Estructuras De Datos Y ArreglosClase 10 Estructuras De Datos Y Arreglos
Clase 10 Estructuras De Datos Y Arreglos
 
Estructuras de datos y tipos de datos abstractos
Estructuras de datos y tipos de datos abstractosEstructuras de datos y tipos de datos abstractos
Estructuras de datos y tipos de datos abstractos
 
Java pilas (Stacks) y colas (Queues)
Java pilas (Stacks) y colas (Queues)Java pilas (Stacks) y colas (Queues)
Java pilas (Stacks) y colas (Queues)
 

Ähnlich wie Arboles (20)

Arboles
ArbolesArboles
Arboles
 
Arbolbin
ArbolbinArbolbin
Arbolbin
 
Arboles.
Arboles.Arboles.
Arboles.
 
Árboles Binarios
Árboles BinariosÁrboles Binarios
Árboles Binarios
 
Arboles
ArbolesArboles
Arboles
 
Arboles
ArbolesArboles
Arboles
 
áRboles
áRbolesáRboles
áRboles
 
áRboles
áRbolesáRboles
áRboles
 
Arboles 2014 final
Arboles 2014 finalArboles 2014 final
Arboles 2014 final
 
Mulesoft arboles
Mulesoft arbolesMulesoft arboles
Mulesoft arboles
 
ARBOLES-.pdf
ARBOLES-.pdfARBOLES-.pdf
ARBOLES-.pdf
 
Arboles+[Modo+De+Compatibilidad]
Arboles+[Modo+De+Compatibilidad]Arboles+[Modo+De+Compatibilidad]
Arboles+[Modo+De+Compatibilidad]
 
Arboles
ArbolesArboles
Arboles
 
ARBOLES BINARIOS
ARBOLES BINARIOSARBOLES BINARIOS
ARBOLES BINARIOS
 
Programacion estructura de arboles en c
Programacion estructura de arboles en cProgramacion estructura de arboles en c
Programacion estructura de arboles en c
 
Estructuras No Lineales
Estructuras No LinealesEstructuras No Lineales
Estructuras No Lineales
 
Estructura de Datos - árboles y grafos
Estructura de Datos - árboles y grafosEstructura de Datos - árboles y grafos
Estructura de Datos - árboles y grafos
 
Arboles TDAS
Arboles TDASArboles TDAS
Arboles TDAS
 
Arboles
ArbolesArboles
Arboles
 
Arboles exposicion
Arboles exposicionArboles exposicion
Arboles exposicion
 

Mehr von Zamantha Gonzalez Universidad Nacional Abierta

Mehr von Zamantha Gonzalez Universidad Nacional Abierta (20)

Elementos del diseño visual
Elementos del diseño visualElementos del diseño visual
Elementos del diseño visual
 
Instructivo Autocorreccion Pruebas Objetivas UNA
Instructivo Autocorreccion Pruebas Objetivas UNAInstructivo Autocorreccion Pruebas Objetivas UNA
Instructivo Autocorreccion Pruebas Objetivas UNA
 
Estrategias
EstrategiasEstrategias
Estrategias
 
Aspectos básicos de google classroom
Aspectos básicos de google classroomAspectos básicos de google classroom
Aspectos básicos de google classroom
 
Lineamientos curso de iniciación 2017 1
Lineamientos curso de iniciación 2017 1Lineamientos curso de iniciación 2017 1
Lineamientos curso de iniciación 2017 1
 
Presentacion telemática educativa
Presentacion telemática educativaPresentacion telemática educativa
Presentacion telemática educativa
 
Uso y creacion de unidades
Uso y creacion de unidadesUso y creacion de unidades
Uso y creacion de unidades
 
Estrategias objetivo 8
Estrategias objetivo 8Estrategias objetivo 8
Estrategias objetivo 8
 
Estrategias objetivo 7
Estrategias objetivo 7Estrategias objetivo 7
Estrategias objetivo 7
 
Estrategias objetivo 6
Estrategias objetivo 6Estrategias objetivo 6
Estrategias objetivo 6
 
Estrategias objetivo 5
Estrategias objetivo 5Estrategias objetivo 5
Estrategias objetivo 5
 
Geolocalización móvil
Geolocalización móvilGeolocalización móvil
Geolocalización móvil
 
Realidad aumentada
Realidad aumentadaRealidad aumentada
Realidad aumentada
 
Traductores de lenguaje
Traductores de lenguajeTraductores de lenguaje
Traductores de lenguaje
 
Tipos de datos en pascal
Tipos de datos en pascalTipos de datos en pascal
Tipos de datos en pascal
 
EVERNOTE
EVERNOTEEVERNOTE
EVERNOTE
 
Encuentro inicial
Encuentro inicialEncuentro inicial
Encuentro inicial
 
Encuentro inicial estudiantes primer semestre
Encuentro inicial estudiantes primer semestreEncuentro inicial estudiantes primer semestre
Encuentro inicial estudiantes primer semestre
 
Tipos de datos
Tipos de datosTipos de datos
Tipos de datos
 
Traductores de lenguaje
Traductores de lenguajeTraductores de lenguaje
Traductores de lenguaje
 

Kürzlich hochgeladen

Desarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdfDesarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdfJulian Lamprea
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveFagnerLisboa3
 
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptxPROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptxAlan779941
 
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdfRefrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdfvladimiroflores1
 
Trabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíaTrabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíassuserf18419
 
Presentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxPresentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxLolaBunny11
 
Avances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estosAvances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estossgonzalezp1
 
Presentación de elementos de afilado con esmeril
Presentación de elementos de afilado con esmerilPresentación de elementos de afilado con esmeril
Presentación de elementos de afilado con esmerilJuanGallardo438714
 
Modulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdfModulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdfAnnimoUno1
 
guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan JosephBRAYANJOSEPHPEREZGOM
 
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptxEL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptxMiguelAtencio10
 
Avances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvanaAvances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvanamcerpam
 
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricKeyla Dolores Méndez
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITMaricarmen Sánchez Ruiz
 
presentacion de PowerPoint de la fuente de poder.pptx
presentacion de PowerPoint de la fuente de poder.pptxpresentacion de PowerPoint de la fuente de poder.pptx
presentacion de PowerPoint de la fuente de poder.pptxlosdiosesmanzaneros
 

Kürzlich hochgeladen (15)

Desarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdfDesarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdf
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial Uninove
 
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptxPROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
 
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdfRefrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
 
Trabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíaTrabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnología
 
Presentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxPresentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptx
 
Avances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estosAvances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estos
 
Presentación de elementos de afilado con esmeril
Presentación de elementos de afilado con esmerilPresentación de elementos de afilado con esmeril
Presentación de elementos de afilado con esmeril
 
Modulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdfModulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdf
 
guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Joseph
 
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptxEL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
 
Avances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvanaAvances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvana
 
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNIT
 
presentacion de PowerPoint de la fuente de poder.pptx
presentacion de PowerPoint de la fuente de poder.pptxpresentacion de PowerPoint de la fuente de poder.pptx
presentacion de PowerPoint de la fuente de poder.pptx
 

Arboles

  • 1. PNFSI Asignatura: Desarrollo de Software Tema: Árboles Ing. Zamantha González Díaz Abril, 2008
  • 2. Tema 3: Árboles Contenido • 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: Árboles Contenido • Árboles generales • Transformación de árboles generales en binarios • Implementación en un lenguaje de programación • Colocación secuencial de árboles
  • 4. Objetivos Conozcan las estructuras de datos arbóreas y las formas de trabajar con ellas en la solución de problemas de mediana complejidad
  • 5. Introducción • Las relaciones entre los nodos de información 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.
  • 6. Introducción ? ¿Qué estructura de datos se debe utilizar para representar estructuras jerárquicas o taxonómicas? Ejemplo: Director SubDir1 SubDir2 SubDir3 J´Dpto1 J´Dpto2 J´Dpto3 J´Dpto4 J´Dpto5
  • 7. Definición de Árbol Un árbol (tree) es un T.D.A. que consta de un conjunto finito T de nodos y una relación R (paternidad) entre los nodos tal que: • Hay un nodo, especialmente designado, llamado la raíz del árbol T. A B C D E F G
  • 8. Definición de Árbol • Los nodos restantes, excluyendo la raíz, son particionados en m (m  0) conjuntos disjuntos T1, T2, ..., Tm, cada uno de los cuales es, a su vez, un árbol, llamado subárbol de la raíz del árbol T. A B C D E F G
  • 9. Definición de Árbol • A los nodos que no son raíces de otros subárboles se les denomina hojas del árbol T, o sea, no tienen sucesores o hijos. A B C D E F G
  • 10. Definición de Árbol Si n es un nodo y A1, A2, A3, A4, A5, …, Ak son árboles con raíces 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 raíz y A1, A2, A3, A4, A5, …, Ak son los subárboles de la raíz. Los nodos n1, n2, n3, n4,…, nk reciben el nombre de hijos del nodo n.
  • 11. 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.
  • 12. Ejemplos A • Padre de C: A • Padre de E: B B C • Padre de G C D E F G • Padre de A: NO • Hijos de A: B C • Hijos de C: F G • Hijos de F: NO
  • 13. 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.
  • 14. Ejemplos Secuencias A • de A a G B C • de A a E E F G • de A a F D C es sucesor de A y F es sucesor de C
  • 15. 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 raíz de un subárbol.
  • 16. Ejemplos A Grado • de A: 2 B C • de E: 3 • de G: 1 D 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
  • 17. Otras definiciones Nivel de un nodo al nivel de su padre más uno. Por definición, la raíz del árbol tiene nivel 0. Esta definición es recursiva.
  • 18. Ejemplos A Nivel de A: 0 B C de E: 2 D E F G de B: 1 de I: 3 H I de G: 2
  • 19. 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 subárbol no vacío.
  • 20. Ejemplos A A B C B C D E F G D E Árbol completo de nivel 2 Árbol no completo de nivel 2 Cada nodo del nivel n es Un nodo del nivel n-1 es una una hoja hoja
  • 21. Otras definiciones Padre de un nodo al nodo raíz del subárbol más pequeño que contiene a dicho nodo y en el cual él no es raíz. Hijo de un nodo al (los) nodo(s) raíz(ces) de uno de sus subárboles. 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.
  • 22. Ejemplos A • Padre de G: C B C • Hijos de C: E F G • Hermanos de I: H J D E F G H I J
  • 23. Otras definiciones Árbol ordenado a todo árbol para el que se considera el orden relativo de los sucesores o subárboles 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 subárboles de un nodo, representa una situación semánticamente diferente.
  • 24. Ejemplos: Árbol genealógico de María (sin los hermanos) María Juan Luisa José Elsa Pedro Lisa El árbol es ordenado • El primer subárbol corresponde al padre. • El segundo subárbol a la madre.
  • 25. Otras definiciones Árbol orientado a un árbol para el cual no interesa el orden relativo de los sucesores o subárboles de cualquier nodo, ya que sólo se tiene en cuenta la orientación 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 solución de problemas informáticos, los más utilizados son los árboles ordenados.
  • 26. Otras definiciones Una floresta es una colección de dos o más árboles disjuntos. Aclaraciones: • Disjuntos significa que no hay nodos en común entre dos árboles cualesquiera de la misma. • De un árbol se obtiene una floresta al quitarle la raíz, si tiene dos hijos o más. • De una floresta se obtiene un árbol al añadir un nodo que sea raíz de todos los árboles que la conforman.
  • 27. Ejemplos A C B B B E G D E F G D F H J H I J I Es un árbol Es una floresta NO es una floresta
  • 28. Definición de Árbol Binario Un árbol binario (en inglés binary tree) es un árbol ordenado de, a lo sumo, grado 2. Aclaraciones: • A lo sumo grado 2 significa que cada nodo tiene como máximo dos hijos, o sea, dos subárboles. • Al ser ordenado el árbol, importa el orden de los subárboles, es decir, que será necesario especificar de cada nodo cuál es el hijo izquierdo y cuál el hijo derecho.
  • 29. Ejemplo María Juan Luisa José Elsa Pedro Lisa El árbol genealógico es un árbol binario. • Cada nodo tiene dos hijos • Es significativo el orden de los subárboles.
  • 30. Árbol Binario: Características Cada nodo del árbol binario contiene: • Una referencia a su información. • Un apuntador a su hijo izquierdo. • Un apuntador a su hijo derecho. Información Hijo Izquierdo Hijo Derecho
  • 31. Recorridos de un Árbol Binario Los recorridos se clasifican de acuerdo al momento en que se visita la raíz del árbol y los subárboles izquierdo y derecho. Existen tres recorridos: • Recorrido en Preorden • Recorrido en orden simétrico o inorden • Recorrido en orden final o Postorden
  • 32. Recorrido en Preorden 1. Visitar la raíz. 2. Recorrer subárbol izquierdo en preorden. 3. Recorrer subárbol derecho en preorden.
  • 33. Recorrido en Preorden A B C D E F G Recorrido: A B D E C F G 1. Raíz. 2. Subárbol izquierdo en preorden. 3. Subárbol derecho en preorden.
  • 34. Recorrido en Simétrico 1. Recorrer subárbol izquierdo en simétrico. 2. Visitar la raíz. 3. Recorrer subárbol derecho en simétrico.
  • 35. Recorrido en Simétrico A B C D E F G Recorrido D B E A F C G 1. Subárbol izquierdo en simétrico. 2. Raíz. 3. Subárbol derecho en simétrico.
  • 36. Recorrido en Postorden 1. Recorrer subárbol izquierdo en orden final. 2. Recorrer subárbol derecho en orden final. 3. Visitar la raíz.
  • 37. Recorrido en Postorden A B C D E F G Recorrido D E B F G C A 1. Subárbol izquierdo en orden final. 2. Subárbol derecho en orden final. 3. Raíz.
  • 38. Á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 };
  • 39. Á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(); };
  • 40. Árboles de Búsqueda Permiten 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.
  • 41. Árboles Lexicográficos Un árbol lexicográfico es un árbol binario que, recorrido en orden simétrico, permite obtener la información de los nodos en algún criterio de ordenamiento. La técnica de construcción de un árbol lexicográfico consiste en un proceso recursivo que va colocando los nodos en el subárbol izquierdo o derecho del nodo raíz, según sea el criterio de ordenamiento deseado (ascendente o descendente).
  • 42. Árboles Lexicográficos Siguiendo un ordenamiento ascendente: 1. 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.
  • 43. Á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 5 Si se recorre en orden simétrico, se obtiene la información de sus nodos en orden ascendente: 1, 2, 4, 5, 7 con independencia del orden de la lista original.
  • 44. Problemas El recorrido de árboles con programas recursivos resulta costoso ya que implica un gasto adicional de memoria y tiempo de ejecución. Para árboles muy grandes se puede desbordar el stack del sistema relativamente pronto. ? ¿Cuál es la solución? Árboles hilvanados
  • 45. Á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 hilván al nodo que le antecede en orden simétrico (excepto el primer nodo en orden simétrico) y cada hijo derecho de valor nulo es sustituido por un enlace o hilván al nodo que le sigue en el recorrido en orden simétrico (excepto el último nodo en orden simétrico).
  • 46. Árboles Hilvanados Ahora, un recorrido en orden simétrico se puede implementar sin necesidad de recursión. Sin embargo, se requiere que los nodos tengan en su estructura algún atributo que permita saber cuándo un enlace es real y cuándo se trata de un hilván. En este caso es necesario un atributo para cada hijo.
  • 47. Árbol Hilvanado Cada 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 5 Indicador Izquierdo (T) T T Indicador Derecho (T) Hijo Izquierdo Hijo Derecho
  • 48. Á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 NULL NULL T F F F F F F T
  • 49. 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 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.
  • 50. 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.
  • 51. Construyendo Árboles Hilvanados A A T T NULL NULL D B D B T T F T F C E NULL NULL F C E F F T F T F NULL F F
  • 52. Árbol Hilvanado: Implementación 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;} };
  • 53. Árboles Balanceados La búsqueda en un árbol lexicográfico puede convertirse en una búsqueda secuencial. Esto sucede porque el árbol no está balanceado, es decir los nodos no están distribuidos uniformemente y se han insertado todos los nodos en profundidad. Esto podría 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.
  • 54. Á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 búsqueda binario, pues cada nodo puede tener más de dos hijos.
  • 55. Árboles AVL Un árbol AVL es un árbol binario de búsqueda en el que las alturas de los subárboles izquierdo y derecho de cualquier nodo se diferencian a lo sumo en uno. La búsqueda es similar a como se hace en un árbol binario de búsqueda (lexicográficos), pero la inserción y la eliminación deben considerar la propiedad del balance.
  • 56. Árboles Generales Director SubDir1 SubDir2 SubDir3 J´Dpto1 J´Dpto2 J´Dpto3 J´Dpto4 J´Dpto5 ? ¿La estructura anterior se puede representar con un árbol binario?
  • 57. Árboles Generales Son árboles cuyo grado es mayor que dos. ? ¿Cómo representarlos?
  • 58. Árboles Generales Por cada nodo: la información y una lista de 1 referencias a cada uno de sus hijos. • Secuencial: Se pierde espacio, cada nodo tiene un agrado diferente. • Enlazada: la manipulación de la lista de hijos se hace difícil.
  • 59. Á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 estarán sus hermanos (si los tiene) con sus descendientes.
  • 60. Transformación de General en Binario A Árbol General A Árbol Binario del General B C D B C E 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.
  • 61. Transformación de General en Binario Floresta Árbol Binario A E A de la Floresta C G H B E B F D I J K L D C F G I H N - 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.
  • 62. Árbol General: Implementación en C++ class TGBinTreeNode: public TBinTreeNode { public: TGBinTreeNode(void* pInfo): TBinTreeNode(pInfo) {} bool IsLeaf() {return !aLeft;} int Degree(); };
  • 63. Árbol General: Implementación en C++ int TGBinTreeNode::Degree() { int degree = 0; TBinTreeNode* cursor = Left(); while (cursor) { degree++; cursor = cursor->Right(); } return degree; }
  • 64. Á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*); };
  • 65. 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.
  • 66. 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.
  • 67. Colocación 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 Árbol binario recorrido en Preorden ENLDER Siguiente hermano en el árbol general, hijo derecho en el binario. Convención: -1 si no existe TERM Indica si el nodo es terminal (no tienen hijo en el general) y no tiene hijo izquierdo (en el binario).
  • 68. Colocación en Preorden Secuencial A A B B C D E C E F G H I J G D F H I ENLDER -1 4 3 -1 6 -1 -1 8 9 -1 J INFO A B E F C G D H I J TERM F F T T F T F T T T
  • 69. Colocación en Preorden Secuencial Aclaraciones: • Los hermanos se obtienen a través del enlace derecho. • Si un nodo no es terminal la siguiente posición de la lista secuencial está ocupada por su hijo. De lo contrario, es familia de otro nodo (hermano o hijo). • Los subárboles están juntos, primero el padre y luego los hijos.
  • 70. 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;} };
  • 71. Colocación 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. Convención: -1 si no existe FAM Indica último hermano en el árbol general y enlace derecho en NULL en el binario. Indica el nodo final de cada familia
  • 72. Colocación en Orden Familiar A A B B C D E C E F G H I J G D F H I ENLIZQ 1 8 4 -1 -1 -1 -1 -1 -1 7 J INFO A B C D H I J G E F FAM T F F T F F T T F T
  • 73. Colocación en Orden Familiar Aclaraciones: • 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.
  • 74. 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;} };
  • 75. Colocación en Postorden Secuencial 1. 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étrico GRADO Grado del nodo
  • 76. Colocación en Postorden Secuencial A A B B C D E C E F G H I J G D F H I GRADO 0 0 2 0 1 0 0 0 3 3 J TERM E F B G C H I J D A
  • 77. Colocación en Postorden Secuencial Aclaraciones: • 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.
  • 78. 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;} };