1 / 18

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 .

sezja
Télécharger la présentation

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. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


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

  2. Ejemplos C B A 9 5 G D F H 2 4 6 3 7 1 8 10 • Arbol binario lleno • Arbol binario completo

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

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

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

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

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

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

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

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

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

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

  13. 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”

  14. Ejemplo 95 • En que lugar quedaria insertado el numero 20 • Inserta 99 • Inserta 84 97 50 73 96 100 12 200

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

  16. 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;}

  17. 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; else pp->der=c; } delete p; } //fin del else de que lo encontro

More Related