Pro2324 Help

Tema 6 - Árboles

Pásame El Código

Visita nuestra nueva página web con contenidos actualizados y mucho más.

Estos apuntes también están en: Pásame el Código

    ¿Que es un árbol?

    Esto es un Árbol
    _A_
    _B_
    _C_
    _F_
    _G_
    _H_
    Esto es un Árbol

    Definido por:

    • Una raíz: A, padre de B, C y F.

    • G hermanos H, hijos de B y descendientes de A.

    • Altura del árbol: 3

    • Grado del árbol: 3 (Nº de hijos máximo, alcanzado por A)

    Para trabajar con Árboles Binarios es importante tener claro el concepto de árbol lleno y árbol completo.

    Árbol Lleno

    Árbol Completo

    Todas sus hojas están al mismo nivel h y todos los nodos anteriores tienen el número máximo de hijos (en un árbol binario, 2).

    Todas sus hojas llenas hasta h-1 y todos los nodos del nivel h están lo más a la izquierda posible.

    _A_
    _B_
    _C_
    _D_
    _E_
    _F_
    _G_
    _A_
    _B_
    _C_
    _D_
    _E_
    _F_
    NULL

    TAD Árbol Binario

    Un árbol binario es un conjunto cero o más de elementos del mismo tipo llamados nodos.

    • O bien 0 nodos, en cuyo casa: árbol vacío

    • O bien existe un elemento distinguido llamado raíz, y el resto de los nodos se distribuyen en dos subconjuntos, y a su vez cada nodo tiene una serie de hasta dos hijos los cuales solo pueden tener hasta dos hijos. Formando así los subconjuntos siguientes.

    TAD Árbol Binario
    ÁRBOL
    A
    B
    C
    D
    NULL
    NULL
    NULL
    NULL
    NULL
    TAD Árbol Binario

    Operaciones

    Siguiendo los pasos para la especificación de un TAD, definimos las operaciones del mismo clasificándolas en: constructoras, generadoras, modificadoras, observadoras y destructoras.

    Generadoras


    • Objetivo: Crea un árbol vacío
      Salida: Un árbol vacía
      PosCondición: El árbol sin datos

      ÁRBOL
      NULL
      // SPDX-FileCopyrightText: 2023 Fernando Álvarez // // SPDX-License-Identifier: GPL-3.0-only void createEmptyTree(tBinTree *T){ *T = TNULL; }

    • Objetivo: Crea un árbol con cierta información en la raíz y como hijos los árboles que se reciben en las entradas.
      Entrada:
      - Tree(1): Árbol que constituirá el hijo izquierdo.
      - Item: Contenido del elemento raíz.
      - Tree(2): Árbol que constituirá el hijo derecho.
      Salida: Tree: Nuevo árbol construido y verdadero si se ha podido construir, falso en caso contrario.

      1
      2
      3
      ÁRBOL1
      A
      B
      C
      ITEM
      ÁRBOL2
      1
      2
      3
      ÁRBOL1
      A
      B
      C
      ÁRBOL
      ITEM
      ÁRBOL2
      1
      2
      3
      ÁRBOL1
      A
      B
      C
      ÁRBOL
      ITEM
      ÁRBOL2
      // SPDX-FileCopyrightText: 2023 Fernando Álvarez // // SPDX-License-Identifier: GPL-3.0-only bool BuildTree(tBinTree LT,tItemT itemT,tBinTree RT,tBinTree *T){ if(createNode(T)){ (*T)->data=itemT; (*T)->left=LT; (*T)->right=RT; return true; } else return false; }

    Observadoras


    • Objetivo: Devuelve el árbol que constituye el hijo izquierdo del árbol
      Entrada: Tree: Árbol a manipular
      Salida: Tree: Árbol que constituye el hijo izquierdo o nulo del árbol
      Precondición: El árbol no está vacío

      A
      B
      C
      leftChild
      // SPDX-FileCopyrightText: 2023 Fernando Álvarez // // SPDX-License-Identifier: GPL-3.0-only tBinTree LeftChild(tBinTree T){ return T->left; }

    • Objetivo: Devuelve el árbol que constituye el hijo derecho del árbol
      Entrada: Tree: Árbol a manipular
      Salida: Tree: Árbol que constituye el hijo derecho o nulo del árbol
      Precondición: El árbol no está vacío

      A
      B
      C
      rightChild
      // SPDX-FileCopyrightText: 2023 Fernando Álvarez // // SPDX-License-Identifier: GPL-3.0-only tBinTree RightChild(tBinTree T){ return T->right;ç }

    • Objetivo: Devuelve el dato de la raíz del árbol
      Entrada: Tree: Árbol a manipular
      Salida: Item: Contenido del elemento de la raíz
      PreCondición: El árbol no está vacío

      ROOT = B
      B
      ROOT = A
      A
      C
      ROOT = C
      // SPDX-FileCopyrightText: 2023 Fernando Álvarez // // SPDX-License-Identifier: GPL-3.0-only tItemT Root(tBinTree T){ return T->data; }

    • Objetivo: Determina si el árbol está vacío
      Entrada: Tree: Árbol a manipular
      Salida: Verdadero si el árbol está vacía, falso en caso contrario

      A
      B
      C
      NULL
      NULL
      isEmptyTree = false
      NULL
      NULL
      isEmptyTree = true
      // SPDX-FileCopyrightText: 2023 Fernando Álvarez // // SPDX-License-Identifier: GPL-3.0-only bool isEmptyTree(tBinTree T){ return (T==TNULL); }

    Recorridos de Árboles

    Árbol de ejemplo
    _A_
    _B_
    _C_
    _D_
    _E_
    _G_
    _H_
    _F_
    NULL
    Árbol de ejemplo

    Recorridos en profundidad

    Vídeo explicativo de los recorridos en profundidad.

    Preorden (R | ID)

    • (R) Raíz

    • (I) Izquierdo

    • (D) Derecho

    (R)
    (I)
    (R)
    (I)
    (R)
    (I)
    (D)
    (D)
    (R)
    etc
    A, B, D, E, F, C, G, H
    _A_
    _B_
    _C_
    _D_
    _E_
    NULL
    NULL
    _G_
    _H_
    _F_
    NULL

    Inorden (I | R | D)

    • (I) Izquierdo

    • (R) Raíz

    • (D) Derecho

    (I)
    (I)
    (R)
    (I)
    (R)
    (D)
    etc
    D, B, F, E, A, G, C, H
    _A_
    _B_
    _C_
    _D_
    _E_
    NULL
    NULL
    _G_
    _H_
    _F_
    NULL

    Posorden (ID | R)

    • (I) Izquierdo

    • (D) Derecho

    • (R) Raíz

    (I)
    (I)
    (I)
    (D)
    (R)
    (D)
    etc
    D, F, E, B, G, H, C, A
    _A_
    _B_
    _C_
    _D_
    _E_
    NULL
    NULL
    _G_
    _H_
    _F_
    NULL

    Recorrido en anchura

    1
    2
    3
    4
    _F_
    NULL
    _D_
    _E_
    _G_
    _H_
    _B_
    _C_
    _A_
    A, B, C, D, E, F, G, H, F
    Last modified: 02 November 2024