Estructuras de datos heap mont culo
Download
1 / 18

Estructuras de datos Heap (montículo) - PowerPoint PPT Presentation


  • 210 Views
  • Uploaded on

Estructuras de datos Heap (montículo). Un árbol completo , es aquel en el que todos los niveles, con excepción del último, tiene sus nodos completos. Un arbol perfectamente equilibrado hasta el penultimo nivel, y en el ultimo nivel los nodos se encuentran agrupados a la izquierda .

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about ' Estructuras de datos Heap (montículo)' - sezja


An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
Estructuras de datos heap mont culo
Estructuras de datos Heap (montículo)

  • Un árbol completo, es aquel en el que todos los niveles, con excepción del último, tiene sus nodos completos. Un arbol perfectamente equilibrado hasta el penultimo nivel, y en el ultimo nivel los nodos se encuentran agrupados a la izquierda .

  • Un Heap es un árbol binario completo a izquierda, que permite implementar una cola con prioridad, y donde los elementos se almacenan cumpliendo la propiedad de que la clave de un nodo siempre es mayor (o menor) que la clave de cualquiera de sus hijos. Lo que nos asegura que la raíz del árbol, en un Heap, siempre es el elemento mayor (o menor) de la estructura.


Ejemplos
Ejemplos

C

B

A

9

5

G

D

F

H

2

4

6

3

7

1

8

10

  • Arbol binario lleno

  • Arbol binario completo


Monticulo o heap

El acceso a los elementos del Heap en un arreglo, se hace a través de algunas operaciones aritméticas básicas:

Left(i)    : return 2*i   .- Obtiene el hijo izquierdo del elemento i.

Right(i)  : return 2*i +1 .- Obtiene el hijo derecho del elemento i.

Parent(i): return floor(i/2) .- Obtiene el padre del elemento i.

Monticulo o Heap


Crear un arbol binario
Crear un arbol binario través de algunas operaciones aritméticas básicas:

  • Carga(nodo)

    1.- Leer informacion(info)

    2.- Hacer nodo^.info=info

    3.- Escribir “Existe nodo por la izquierda?”

    4.- Leer repuesta

    5.- Si respuesta es afirmativa

    entonces

    crea(otro)

    hacer nodo^.izq=otro

    regresar a carga(nodo^.izq)//llamada recursiva

    sino

    hacer nodo^.izq=Nil

    6.- fin del paso 5

    7.- 3.- Escribir “Existe nodo por la derecha?”

    8.- Leer repuesta

    9.- Si respuesta es afirmativa

    entonces

    crea(otro)

    hacer nodo^.der=otro

    regresar a carga(nodo^.der)//llamada recursiva

    sino

    hacer nodo^.der=Nil

    10.- fin del paso 9


Recorridos de arboles
Recorridos de arboles través de algunas operaciones aritméticas básicas:

  • Recorrido en preorden

    1.-Visita la raiz

    2.- recorre el subarbol izquierdo

    3.- recorre el subarbol derecho

  • Recorrido en inorden

    1.- recorre el subarbol izquierdo

    2.- Visita la raiz

    3.- recorre el subarbol derecho

  • Recorrido en postorden

    1.- recorre el subarbol izquierdo

    2.- recorre el subarbol derecho

    3.- Visita la raiz


Algoritmo para recorrerlo en preorden
Algoritmo para recorrerlo en Preorden través de algunas operaciones aritméticas básicas:

  • Preorden(nodo)

    1.- Si nodo <>nil entonces

    visita el nodo(escribir la info del nodo)

    Regresa preorden(nodo^.izq)

    Regresa preorden(nodo^.der)

    2.- fin del paso 1


Algoritmo para recorrerlo en inorden
Algoritmo para recorrerlo en Inorden través de algunas operaciones aritméticas básicas:

  • Inorden(nodo)

    1.- Si nodo <>nil entonces

    Regresa inorden(nodo^.izq)

    visita el nodo(escribir la info del nodo) Regresa inorden(nodo^.der)

    2.- fin del paso 1


Algoritmo para recorrerlo en postorden
Algoritmo para recorrerlo en Postorden través de algunas operaciones aritméticas básicas:

  • Postorden(nodo)

    1.- Si nodo <>nil entonces

    Regresa Postorden(nodo^.izq)

    Regresa postorden(nodo^.der)

    visita el nodo(escribir la info del nodo)2.- fin del paso 1


Ejemplos1

95 través de algunas operaciones aritméticas básicas:

14

96

73

18

29

13

Ejemplos:

  • Carga los nodos: 95-96-13-73-14-18-29

  • Recorrido

    Preorden95-96-13-73-14-18-29

    Inorden13-96-73-95-18-14-29

    Postorden 13-73-96-18-29-14-95


Arboles binarios de busqueda
Arboles binarios de busqueda través de algunas operaciones aritméticas básicas:

  • Para todo nodo T del arbol debe cumplirse que todos los valores de los nodos del subarbol izquierdo de T seran menores al valor del nodo T y todos los valores de los nodos del subarbor derecho de T deben ser mayores. Si los valores se repiten solo se inserta una vez.


Insercion en un arbol binario de busqueda

95 través de algunas operaciones aritméticas básicas:

104

16

73

100

129

13

Insercion en un arbol binario de busqueda

  • Insercion(nodo,info)

    1.- Si nodo<>Nil

    entonces

    1.1 Si info<nodo^.info

    entonces

    insercion(nodo^.izq,info)

    sino

    1.1.1 Si info>nodo^.info

    entonces

    insercion(nodo^.der,info)

    sino

    Escribir “informacion ya existente”

    1.1.2 fin de 1.1.1

    1.2 fin de 1.1

    sino

    crea(otro)

    otro^.izq=otro^.der=Nil

    otro^.info=info,nodo=otro.

    2.- fin de 1

Insertar:95,16,104,13,100,129,73


Recorridos en un arbol binario de busqueda

95 través de algunas operaciones aritméticas básicas:

104

16

73

100

129

13

Recorridos en un arbol binario de busqueda

  • Preorden: 95-16-13-73-104-100-129

  • Postorden13-73-16-100-129-104-95

  • Inorden:13-16-73-95-100-104-129


Busqueda de un elemento en un arbol binario de busqueda recursivo
Busqueda de un elemento en un arbol binario de busqueda(recursivo)

  • Busqueda(nodo,info)

    1.- Si nodo<>Nil

    entonces

    1.1 Si info<nodo^.info

    entonces

    Busqueda(nodo^.izq,info)

    sino

    1.1.1 Si info>nodo^.info

    entonces

    Busqueda(nodo^.der,info)

    sino

    Escribir “El dato esta en el arbol”

    1.1.2 fin del paso 1.1.1

    1.2 fin del paso 1.1

    sino

    Escribir “El dato no esta en el arbol”


Ejemplo
Ejemplo busqueda(recursivo)

95

  • En que lugar quedaria insertado el numero 20

  • Inserta 99

  • Inserta 84

97

50

73

96

100

12

200


Eliminar un nodo
Eliminar un nodo busqueda(recursivo)

  • Hay que eliminar un nodo si violar los principios que definen un arbol binario de busqueda.

    1.- Si el nodo es terminal u hoja, simplemente se suprime

    2.- Si solo tiene un solo descendiente, entonces tiene que sustituirse por ese descendiente

    3.- Si tiene dos descendientes, entonces se tiene que sustituir por el nodo que se encuentra mas a la derecha en el subarbol izquierdo o mas a la izquierda en el subarbol derecho.

    Pero antes de eliminarlo se tiene que encontrar.

    Para eliminar podemos seleccionar el mas grande del subarbol izquierdo o el mas pequeño del subarbol derecho del nodo a eliminar


Algoritmo de eliminacion
Algoritmo de eliminacion busqueda(recursivo)

Elimina(int k,int e) //elimina el elemento k y guarda el valor en e

{ nodoarbol *p=root,*pp=NULL;

while(p && p->dato!=k)//este recorrido busca el nodo, en pp se guada el padre

{ pp=p; //del que queremos borrar y en p el nodo a borrar

if(k<p->dato) p=p->izq;

else p=p->der; }

If(!p) cout<<“No se encuntra el dato”;//si no encontro a k

else {e=p->dato;

If(p->izq &&p->der) //si tiene dos hijos, encuentra el mas grande del subarbol izquierdo

{nodoarbol *s=p->izq,*ps=p; //izquierdo de p

while(s->der)

{ ps=s;

s=s->izq;} //se mueve al mas grande

p->dato=s->dato; //copia el dato del mas grande a p

p=s;

pp=ps;}


Continuacion
Continuacion…. busqueda(recursivo)

//p tiene por lo menos un hijo, lo guarda en c

nodoarbol *c; //p tiene por lo menos un subarbol

If(p->izq) c=p->izq;

else c=p->der;

If(p==root) root=c;

else { //identificar si p es el hijo izquierdo o derecho de pp

If(p==pp->izq) pp->izq=c;

else pp->der=c;

}

delete p;

} //fin del else de que lo encontro


ad