12. Arboles (1).ppt

39
ARBOLES ESTRUCTURAS DE DATOS

Transcript of 12. Arboles (1).ppt

  • ARBOLESESTRUCTURAS DE DATOS

  • INTRODUCCIONLas listas enlazadas son estructuras linealesSon flexibles pero son secuenciales, un elemento detrs de otroLos rbolesJunto con los grafos son estructuras de datos no linealesSuperan las desventajas de las listasSus elementos se pueden recorrer de distintas formas, no necesariamente uno detrs de otroSon muy tiles para la bsqueda y recuperacin de informacin

  • CONCEPTOEstructura que organiza sus elementos formando jerarquas: PADRES E HIJOSUn subrbol de un rbol Es cualquier nodo del rbol junto con todos sus descendientesLos elementos de un rbol se llaman nodosSi un nodo p tiene un enlace con un nodo m, p es el padre y m es el hijoLos hijos de un mismo padre se llaman: hermanosTodos los nodos tienen al menos un padre, menos la raz: ASi no tienen hijos se llaman hoja: D, E, F y CA es PadreB y C hijos de A: hermanosB es PadreD, E, F hijos de B

  • TERMINOLOGIACamino: Secuencia de nodos conectados dentro de un arbolLongitud del camino: es el numero de nodos menos 1 en un caminoAltura del rbol: es el nivel mas alto del rbolUn rbol con un solo nodo tiene altura 1Nivel(profundidad) de un nodo: es el numero de nodos entre el nodo y la raz. Nivel de un rbolEs el numero de nodos entre la raz y el nodo mas profundo del rbol, la altura del un rbol entoncesGrado(aridad) de un nodo: es numero de hijos del nodoGrado(aridad) de un rbol: mxima aridad de sus nodos

  • TDA ARBOL : DEFINICION INFORMALValores: Conjunto de elementos, donde SOLO se conoce el nodo razUn nodo puede almacenar contenido y estar enlazado conSus rboles hijos (pueden ser dos o varios)Operaciones: Dependen del tipo de rbol, pero en general tenemosVaciar o inicializar el Arbolvoid Arbol_Vaciar (Arbol *A);Eliminar un rbolvoid Arbol_Eliminar(Arbol *A);Saber si un rbol esta vacobool Arbol_EstaVacio(Arbol A);Recorrer un rbolvoid PreOrden(Arbol A)void EnOrden(Arbol A)void PostOrden(Arbol A)

  • TDA ARBOL: DEFINICION FORMAL ::= | ::= {} ::= {}

  • ARBOLES BINARIOSTipo especial de rbolCada nodo no puede tener mas de dos hijos Un rbol puede ser un conjuntoVaco, no tiene ningn nodoO constar de tres partes:Un nodo raz yDos subrboles binarios: izquierdo y derechoLa definicin de un rbol binario es recursivaLa definicin global depende de si mismaSub. Izq.Sub. Der.

  • DEFINICIONES RECURSIVASLa definicin del rbol es recursivaSe basa en si mismaLa terminologa de los rbolesTambin puede ser definida en forma recursivaEjemplo: NIVEL de un rbolIdentificar el caso recursivo y el caso mas bsicoCaso BsicoUn rbol con un solo nodo tiene nivel 1Caso RecursivoSi tiene mas de un nodo, el nivel es:1 + MAX(Nivel(SubIzq), Nivel(SubDer))S. izq.Nivel 1S. der.Nivel 1Nivel Del Arbol: 2SUB. IZQ.Nivel = 1 + Max(0,Sub.Izq)SUB. DER.Nivel 1SUB. IZQ.Nivel = 1 + Max(0,Sub.Izq.)SUB. DER..Nivel = 1

    NIVEL : 1 + MAX(S.IZQ, S.DER)NIVEL : 1 + MAX(3, 1)NIVEL : 4SUB. IZQ.Nivel = 3

  • ARBOLES BINARIOS LLENOSUn rbol de altura h, esta lleno siTodas sus hojas esta en el nivel hLos nodos de altura menor a h tienen siempre 2 hijosRecursivaSi T esta vaco, Entonces T es un rbol binario lleno de altura 0Si no esta vaco, y tiene h>0Esta lleno si los subrboles de la raz, son ambos rboles binarios llenos de altura h-1

  • ARBOLES BINARIOS COMPLETOSUn arbol de altura h esta completo siTodos los nodos hasta el nivel h-2 tienen dos hijos cada uno yEn el nivel h-1, si un nodo tiene un hijo derecho, todas las hojas de su subarbol izquierdo estn a nivel hSi un arbol esta lleno, tambien esta completo

  • OTROSUn rbol equilibrado es cuando La diferencia de altura entre los subrboles de cualquier nodo es mximo 1Un rbol binario equilibrado totalmenteLos subrboles izquierdo y derecho de cada nodo tienen las misma altura: es un rbol llenoUn rbol completo es equilibradoUn rbol lleno es totalmente equilibrado

  • RECORRIDOS DE UN A.B.Recorrer esVisitar todos los elementos de una estructuraComo recorrer un rbolHay tantos caminos, cual escoger?Existe tres recorridos tpicosNombrados de acuerdo a la posicin de la razPreorden: raz - subarbol izq. - subarbol der.Enorden : subarbol izq. - raz - subarbol der.Postorden : subarbol izq. - subarbol der. -raz

  • EJEMPLO PREORDENGG-DG-D-BG-D-B-AG-D-B-A-CG-D-B-A-C-EG-D-B-A-C-E-FG-D-B-A-C-E-F-KG-D-B-A-C-E-F-K-HG-D-B-A-C-E-F-K-H-JG-D-B-A-C-E-F-K-H-J-IG-D-B-A-C-E-F-K-H-J-I-MG-D-B-A-C-E-F-K-H-J-I-M-L1. Visitar raiz2. Preorden al Subarbol Izq.3. Preorden al Subarbol Der.

  • AB y NODOAB: DEFINICION FORMAL::= nulo | ::=++::=::=::|{}

  • AB Y NODOAB: DECLARACIONUn rbol binario: conjunto de nodosSolo se necesita conocer el nodo razCada nodoTiene Contenido y Dos enlaces: rbol hijo izquierdo, rbol hijo derechoUn nodo hoja, es aquel cuyos dos enlaces apunta a nullUn nodo en un rbol tiene mas punteros a null que un nodo de una listaDe un rbol solo se necesita conocer su razLa raz, que es un nodo, puede definir al rbol otypedef struct NodoAB{Generico G;NodoAB *izq, *der;}NodoAB;typedef struct NodoAB *AB;

  • NODOAB: OPERACIONESElemento de un rbol que Almacena informacin (contenido), Conoce hijo izq. y derecho, ambos son nodosOperaciones BsicasCrear un nuevo nodo hoja y eliminar hoja existenteNodoAB *NodoAB_CrearHoja(Generico G);void NodoAB_Eliminar (NodoArbol **A);Saber si el nodo es o no hojabool NodoAB_EsHoja(NodoArbol *p);

  • NODOAB: MAS OPERACIONESConsultas de los campos de un nodoGenerico NodoAB_ConsultaContenido(NodoAB *nodo);NodoAB *NodoAB_Izq (NodoAB *nodo);NodoAB *NodoAB_Der(NodoAB *nodo);Cambiar los campos de un nodovoid NodoAB_SetContenido (NodoAB *nodo , Generico G);void NodoAB_SetIzq(NodoAB *nodo, NodoAB *enlace);void NodoAB_SetDer(NodoAB *nodo, NodoAB *enlace);

  • AB: CREAR NODO HOJASe debe crear un nodo nuevito: un nodo hojaNodoAB *NuevaHoja(Generico G){NodoAB *nuevo;nuevo = (NodoAB *)malloc(sizeof(NodoAB));nuevo->G = G;nuevo->izq = NULL;nuevo->der= NULL;return nuevo;}

  • AB: OPERACIONESCrear y EliminarAB_Vaciar(AB *A);AB_Eliminar(AB *A);Estado del Arbolbool AB_EstaVacio(AB A);Aadir y remover nodos void AB_InsertarNodo(AB *A, NodoAB *nuevo)NodoAB *AB_SacarNodoxContenido(AB *A, Generico G, Generico_fnComparar fn);NodoAB * AB_SacarNodoxPos(AB *A, NodoAB *pos);Busqueda por contenidoNodoArbol *AB_Buscar(AB A, Generico G, Generico_fnComparar fn );Recorridosvoid AB_PreOrden(AB A);void AB_PosOrden(ABl A);void AB_EnOrden(AB A);

  • AB: INSTANCIANDO Y CREANDOUn Arbol Vaco, es aquel cuyo nodo raz apunta a NULLvoid AB_Vaciar(AB *A){*A = NULL;}Para crear una variable tipo Arbol, y empezarla a usar:Instanciarlo (crear variable)Vaciar el rbolPara aadirle una hoja al rbol, crear hoja:AB A;AB_Vaciar(&A);A = NodoAB_CrearHoja(Generico_CrearEntero(1));1A

  • RECORRIDOS: IMPLEMENTACIONComo ya revisamos, las operaciones de recorrido son recursivasEjemplo: EnOrdenRecorrer EnOrden al subarbol izquierdoVisitar nodo raizRecorrer EnOrden al subarbol derechoEn todo algoritmo recursivo debemos buscar dos casosBsico, para terminar la recursividadRecursivo, donde la funcin se llama a si mismaCaso BsicoSi AB_EstaVacio(raiz)Terminar de recorrerCaso RecursivoSi !AB_EstaVacio(raiz)AB_EnOrden(raiz->izq);Mostrar raiz->IAB_EnOrden(raiz->der);

  • OPERACION ENORDENvoid AB_EnOrden(AB A, Generico_fnImprimir imprimir){if(!AB_EstaVacio(A)){AB_EnOrden(A->izq,imprimir); imprimir(A->G);AB_EnOrden(A->der,imprimir);}}Arbol Vacio!, TerminarArbol Vacio!, TerminarArbol Vacio!, TerminarArbol Vacio!, TerminarArbol Vacio!, TerminarArbol Vacio!, TerminarArbol Vacio!, TerminarArbol Vacio!, Terminar

  • APLICACIN: EVALUACION DE EXPRESIONES Ya sabemos lo de las expresiones, cierto?InFija, operador en medioPreFija, operador antes de dos operandosPosFija, operador luego de dos operandosPara evaluar una expresion dada, podriamosPasarla a posfija y usar solo pilasPasarla a posfija y usar pilas y un arbol de expresion

  • ARBOL DE EXPRESIONArboles que representan expresiones en memoriaTodos los operadores tienen dos operandosLa raiz puede contener el operadorHijo izq: operando 1, Hijo derecho: operando 2Ejemplo: (a+b)(a+b)*c

  • EJERCICIO EN CLASEConstruya arboles de expresion para:[X+(Y*Z)] * (A-B)Deducir las expresiones de los siguientes A.B.

  • EVALUAR UNA EXPRESION ARTIMETICA EN INFIJALa expresion se transforma a la expresion posfijaEsto, ya sabemos como hacerCrear un arbol de expresionPara esto se va a usar una pila y un arbol de caracteresUsando el arbol, evaluar la expresion

  • CREAR UN ARBOL DE EXPRESIONLos operandos seran siempre nodos hoja del arbolAl revisar un operando, creo una nueva hoja y la recuerdoLos operadores seran nodos padreAl revisar un operador, recuerdo las dos ultimas hojas creadas y uno todoNo debo olvidar el nuevo arbolito que he creadoA*B-C*D+HAB*CD*-H+AB*BACD*DC-H+H

  • EVALUACION DE LA EXP. POSTFIJALo ideal es recuperar los dos operandos, el operador, y ejecutar la opcionQue recorrido es el ideal?PostOrdenPara evaluar el arbol:Si el arbol tiene un solo nodo y este almacena un operandoEl resultado de la evaluacion es el valor de ese operandoSi no1. Res1 = Evaluo subarbol izquierdo2. Res2 = Evaluo subarbol derecho3. Recupero la info de la raiz y efectuo la operacin alli indicada, entre Res1 y Res2AA y BA * B(A * B) y C(A * B) y C y D(A * B) y (C*D)(A * B) - (C*D)(A * B) - (C*D) y H(A * B) - (C*D) + H

  • ARBOL BINARIO DE BUSQUEDALos elementos en un arbolHasta ahora no han guardado un ordenNo sirven para buscar elementosLos arboles de busquedaPermiten ejecutar en ellos busqueda binariaDado un nodo:Todos los nodos del sub. Izq. Tienen una clave menor que la clave de la raizTodos los nodos del sub. Der. Tienen una clave mayor que la clave de la raiz

    30417555485

  • TDA ABB: DEFINICIONValores: Conjunto de elementos Dado un nodo p, Los nodos del arbol izquierdo almacenan valores mayores al de pLos nodos del arbol derecho almacenan valores menores al de pOperacionesSon las mismas operaciones que para un ABPero en este caso ya tenemos reglas suficientes que nos indican como:InsertarSacar yBuscar

    ::= NULL | ::=+++::=::=::|{}::|{}typedef struct ABB_Nodo{Generico clave, G;ABB_Nodo *izq, *der;}ABB_Nodo;

  • CREAR CON CLAVEComo el nodo ahora tiene un campo claveCambian un poco las operaciones del nodoEjemploNodoAB *NuevaHoja(Generico clave, Generico contenido){NodoArbol *nuevo;nuevo = malloc(sizeof(NodoArbol));nuevo->clave = clave;nuevo->G = contenido;nuevo->izq = NULL;nuevo->der= NULL;return nuevo;}

  • CREACION DE UN ABBUn arbol de busqueda debe mantenerA la derecha mayor a raizA la izq. Menor a raizEjemplo:Construya arbol con los siguientes elementos: 8, 3, 1, 20, 10, 5, 4831201054

  • EJERCICIO EN CLASEConstruya el arbol para almacenar:12, 8, 7, 16, 11

  • BUSQUEDA DE UN NODODada una clave, devolver el nodo que la contieneSe comienza en la raizSi el arbol esta vacioNo se encontroSi clave buscada es igual a la clave del nodo evaluadoBINGO, LO ENCONTRESi noSi la clave buscada es mayor a la del nodo evaluadoBuscar en el subarbol derechoSi noBuscar en el subarbol izquierdoBuscar(raiz,5)55Buscar(raiz,25)No existe

  • IMPLEMENTACION DE LA BUSQUEDANodoABB *ABB_Buscar(ABB A, Generico clave, Generico_fnComparar comp){if(ABB_EstaVacio(A)) return NULL;if(f(clave, A->clave) == 0) return A;if(f(clave, A->clave) > 0))return ABB_Buscar(A->der, clave, comp);elsereturn ABB_Buscar(A->izq, clave, comp);}

  • INSERCION DE UN NODOMuy parecido a la busquedaDebo insertar en la posicion correctaEl arbol debe mantener sus propiedadesPasos:Crear una nueva hojaBuscar en el arbol donde ponerlaEnlazar el nuevo nodo al arbolInsertar(raiz,15)15>8der1510derInsertar aqui15

  • IMPLEMENTACION DE LA INSERCIONbool ABB_Insertar(ABB *A, NodoABB *nuevo, Generico_fnComparar f){if(!ABB_EstaVacio(*A)){if(f(nuevo->clave, (*A)->clave) >0)ABB_Insertar((*A)->der, nuevo,f);else if(f(nuevo->clave, (*A)->clave) izq,nuevo,f);elsereturn FALSE;} else{//Si esta vacio, alli insertar*A = nuevo;}return TRUE;}

  • ELIMINACION DE UN NODOEs mas compleja que la insercionAl sacar un nodo del arbolEl arbol debe mantener sus propiedadesEl arbol debe reajustarsePasos:Buscar el nodo p que se va a eliminarSi el nodo a eliminar tiene menos de dos hijosSubir el nodo hijo a la pos. del nodo eliminadoSi noUbicar el nodo q con la mayor de las claves menoresReemplazar contenido de p con el del nodo qEliminar el nodo q que se encontro el el primer pasoEliminar(raiz,34)34nmayor2828

  • SACAR NODO: CODIGONodoABB *ABB_SacarNodoxContenido(ABB *A, Generico clave, Generico_fnComparar fn){NodoABB *p, *tmp = *A;if(ABB_EstaVacio(*A)) return NULL;if(fn((*A)->clave, clave) < 0)return(ABB_SacarNodoxContenido(&(*A)->der, clave, fn));else if(fn((*A)->clave, clave) >0)return(ABB_SacarNodoxContenido(&(*A)->izq, clave, fn));if((*A)->der == NULL)(*A) = (*A)->izq;else if((*A)->izq == NULL)(*A) = (*A)->der;elsetmp = ABB_SacarRaiz(A);return tmp;}