Estructuras de datos heap mont culo
This presentation is the property of its rightful owner.
Sponsored Links
1 / 18

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


  • 51 Views
  • Uploaded on
  • Presentation posted in: General

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 .

Download Presentation

Estructuras de datos Heap (montículo)

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

  • 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

  • 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

  • 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

  • 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

  • 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

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

  • 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

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

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

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

  • 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

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

//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;

elsepp->der=c;

}

delete p;

} //fin del else de que lo encontro


  • Login