- PowerPoint PPT Presentation

About This Presentation
Title:

Description:

rboles de B squeda Binaria Agust n J. Gonz lez ELO-320: Estructura de Datos y Algoritmos Introducci n Los rboles de b squeda son estructuras de datos que ... – PowerPoint PPT presentation

Number of Views:17
Avg rating:3.0/5.0
Slides: 17
Provided by: Agust58
Category:
Tags: binary | tree

less

Transcript and Presenter's Notes

Title:


1
Árboles de Búsqueda Binaria
  • Agustín J. González
  • ELO-320 Estructura de Datos y Algoritmos

2
Introducción
  • Los árboles de búsqueda son estructuras de datos
    que soportan las siguientes operaciones de
    conjuntos dinámicosSearch -Búsqueda-, Minimum,
    Maximum, Predecessor, Successor, Insert, y
    Delete.
  • Los árboles de búsqueda se pueden utilizar como
    diccionarios y como colas de prioridad.
  • Estas operaciones toman un tiempo proporcional a
    la altura del árbol.
  • Para un árbol completo binario esto es ?(lg n) en
    el peor caso sin embargo, si el árbol es una
    cadena lineal de n nodos, las mismas operaciones
    toman ?(n) en el peor caso.
  • Para árboles creados aleatoriamente, la altura es
    O(lg n), con lo cual los tiempos son ?(lg n).
  • Hay varios esquemas para mejorar el peor caso de
    los árboles de búsqueda. Dos de ellos son los
    árboles 2-3 y los árboles rojo-negro.

3
Propiedad de un árbol búsqueda binaria
  • Sea x un nodo en un árbol de búsqueda binaria. Si
    y es un nodo del sub-árbol izquierdo de x,
    entonces se cumple (clave de y) ? (clave de x).
    Si z es un nodo del sub-árbol dercho de x,
    entonces la se cumple (clave de x) ? (clave de
    z).
  • Por ejemplo, dos árboles de búsqueda binaria son
  • La propiedad de árbol nos permite recorrer o
    imprimir sus nodos en el orden de sus claves
    haciendo uso de un simple algoritmo recursivo.

y
z
4
Recorrido Inorder de un árbol búsqueda binaria
  • Suponiendo una estructura como la vista antes
    para árboles binarios, tenemos
  • typedef struct arbol_tag struct arbol_tag
    p struct arbol_tag left struct arbol_tab
    right elementType element TREE_NODE
  • void Inorder_Tree_Walk( TREE_NODE x) if (x
    ! NULL) Inorder_Tree_Walk(x-gtleft) Print(x
    -gtelement) / podría ser procesar
    elemento/ Inorder_Tree_Walk(x-gtright)
  • Este algoritmo toma tiempo ?(n) porque el
    procedimiento es llamado exactamente dos veces
    por cada nodo.
  • Análogamente se definen recorridos preorder y
    postorder del árbol. El único cambio es el lugar
    de la instrucción de procesamiento del nodo. En
    preorder, el nodo se procesa primero y en
    postorder se procesa después.

5
Recorrido Pre y port-order de un árbol búsqueda
binaria
  • void Preorder_Tree_Walk( TREE_NODE x) if (x
    ! NULL) Print(x-gtelement) / podría ser
    procesar elemento/ Preorder_Tree_Walk(x-gtleft)
    Preorder_Tree_Walk(x-gtright)
  • void Postorder_Tree_Walk( TREE_NODE x) if (x
    ! NULL) Postorder_Tree_Walk(x-gtleft) Posto
    rder_Tree_Walk(x-gtright) Print(x-gtelement)
    / podría ser procesar elemento/
  • El recorrido del árbol con los algoritmos previos
    daría
  • Preorder 5, 3, 2, 5, 7, 8
  • Inorder 2, 3, 5, 5, 7, 8
  • Postorder 2, 5, 3, 8, 7, 5

6
Otras operaciones en un árbol de búsqueda binaria
  • Búsqueda de una clave determinadaTREE_NODE
    Tree_Search( TREE_NODE x, elementType k) if
    (x NULL) return x else if (x-gtelement k
    ) / Ojo esta comparación podría ser una
    función/ return x else if (k lt
    x-gtelement) return Tree_Search( x-gtleft,
    k) else return Tree_Search( x-gtright, k)
  • El tiempo de este algoritmo es O(h) donde h es la
    altura del árbol.
  • Este procedimiento se puede desenrollar para
    eliminar el tiempo de múltiples llamados a la
    misma función. Ver --gt

7
Otras operaciones en un árbol de búsqueda binaria
  • Búsqueda de una clave determinada
  • TREE_NODE Tree_Search( TREE_NODE x,
    elementType k) while(x ! NULL) if
    (x-gtelement k ) return x else if (k lt
    x-gtelement) x x-gtleft else x
    x-gtright return x

8
Máximo y Mínimo en un árbol de búsqueda binaria
  • TREE_NODE Tree_Maximum( TREE_NODE x) if (x
    NULL) return x while (x-gtright ! NULL )
    x x-gtright return x
  • TREE_NODE Tree_Minimum( TREE_NODE x) if (x
    NULL) return x while (x-gtleft ! NULL )
    x x-gtleft return x

9
Sucesor y Antecesor en un árbol de búsqueda
binaria
  • TREE_NODE Tree_Successor( TREE_NODE x)
    TREE_NODE y if (x NULL) return x if
    (x-gtright ! NULL) return Tree_Minimum(x-gtright)
    y x-gtp while ( y ! NULL ) if (x
    y-gtright) x y y y-gtp else
    break return y

10
Sucesor y Antecesor en un árbol de búsqueda
binaria
  • TREE_NODE Tree_Predecessor( TREE_NODE x)
    TREE_NODE y if (x NULL) return x if
    (x-gtleft ! NULL) return Tree_Maximum(x-gtleft)
    y x-gtp while ( y ! NULL ) if (x
    y-gtleft) x y y y-gtp else
    break return y

11
Inserción en un árbol de búsqueda binaria
  • Suponemos inicialmente que z-gtleft z-gtright
    NULL.
  • Void Tree_Insert( TREE_NODE T, TREE_NODE z)
    TREE_NODE y, x yNULL x T while (x
    ! NULL) / buscamos quien debe ser su padre
    / y x if ( z-gtelement lt x-gtelement) x
    x-gtleft else x x-gtright z-gtp
    y if (y NULL) / se trata del primer nodo
    / T z else if (z-gtelement lt
    y-gtelement) y-gtleft z else y-gtright
    z
  • Como el procedimiento de búsqueda, este algoritmo
    toma un tiempo O(h), h es la altura del árbol.

12
Eliminación en un árbol de búsqueda binaria
  • Como entrada disponemos de z, un puntero al nodo
    a remover.
  • Hay tres casos a considerar
  • 1.- Que z sea un nodo hoja. En este caso se
    elimina fácilmente.
  • 2.- Que z sea un nodo sin hijo izquierdo o
    derecho. En este caso, su único sub-árbol sube
    para toma el lugar de z.
  • 3.-z posee dos sub-árboles. En este caso, su
    sucesor no posee hijo izquierdo, luego éste puede
    ser movido desde su posición a la de z.

1)
2)
13
Eliminación tercer caso
  • Caso 3)

14
Eliminación Algoritmo
  • TREE_NODE Tree-Delete(TREE_NODE T, TREE_NODE
    z) TREE_NODE x if (z-gtleft
    NULL z-gtright NULL) y z / caso 1
    y 2 / else y Tree_Successor(z) / caso 3
    // hasta aquí y es un nodo con menos de dos
    hijos y debe ser extraído del árbol/ if
    (y-gtleft ! NULL) x y-gtleft else
    x y-gtright if (x ! NULL)
    x-gtp y-gtp if (y-gtp NULL) / estoy
    eliminado el último nodo / T x else if (y
    y-gtp-gtleft) / y es hijo izquierdo
    / y-gtp-gtleft x else y-gtp-gtright x if
    (y !z) / caso 3 / z-gtelement
    y-gtelement return y

15
Ejercicio
  • Proponga un algoritmo codificado en C o pseudo
    lenguaje que reciba como entrada un puntero a la
    raíz de un árbol binario y retorne su altura.
    (Ayuda observe que la altura de un nodo es uno
    más que la altura mayor de sus hijos)

Sea la siguiente estructura para cada nodo del
árbol typedef struct nodo_arbol struct
nodo_arbol p / puntero al padre / struct
nodo_arbol left / hijo izquierdo / struct
nodo_arbol right / hijo derecho/ ELEMENTO
elemento NODO_ARBOL int Altura (NODO_ARBOL
T) int le, ri if (TNULL) return -1 / en
realidad no está definida la altura en este
caso (por observación de Manuel Jander
2003)/ le Altura(T-gtleft) ri
Altura(T-gtright) if (le gt ri)
return(le1) else return (ri1)
16
Divertimento
  • Antes de que pasara lo que pasara (lo que todos
    sabemos que pasó), los hijos de Adán y Eva
    estaban muy unidos.
  • Si Abel iba a la fiesta, Set también iba. Si Set
    no iba a la fiesta, Caín tampoco. Al menos uno de
    los tres fue a la fiesta.
  • Quién es el que fue?
  • Gentileza de (Orlando Pinto)
Write a Comment
User Comments (0)
About PowerShow.com