POTIII 2.5 rboles Un árbol es un conjunto finito de uno o más nodos tales: 1. xiste un nodo especial denominado RIZ(V 1 ) del árbol 2. os nodos restantes (V 1,V 2,...V n ) se dividen en m>=0 conjuntos disjuntos denominados 1, 2, 3,... m, cada uno de los cuales es, a su vez, un árbol. stos árboles se llaman subárboles de la RIZ. I POTIII 2.5 rboles Raíz: odo que no tiene antecesores odo: Vértices o elementos del árbol odo Terminal u hoja: Vértices o elementos del árbol que no contienen subárboles. ermanos: odos de un mismo padre. odos Interiores: odos que no son hoja ni raíz. osque: olección de dos o más árboles. rista: nlace entre dos nodos consecutivos. amino: Secuencia de aristas consecutivas. Rama: amino que termina en hoja. ivel: ongitud que se determina por la longitud del camino desde la raíz al nodo específico. ltura o profundidad: el número máximo de nodos de una rama. quivale al nivel más alto de los nodos más uno. Peso: es el número de nodos terminales. rado: el número de hijos que salen de un nodo I
POTIII 2.5.1 rboles inarios Un rbol binario es un conjunto finito de cero o más nodos tales que: 1. xiste un nodo denominado raíz del árbol 2. ada nodo tiene 0, 1 o 2 subárboles, conocidos como subárbol izquierdo y subárbol derecho. Se dice que dos árboles binarios son similares si tienen la misma estructura R 3 4 POTIII 2.5.1 rboles inarios Se dice que dos árboles binarios son equivalentes si tienen la misma estructura y además la misma información Se dice que un árbol binario es equilibrado si las alturas de los dos subárboles de cada nodo del árbol se diferencian en una unidad como máximo. T T S
POTIII 2.5.1 rboles inarios Un árbol binario es completo si todos sus nodos, excepto las hojas, tienen exactamente dos subárboles. T S Un árbol binario es lleno si todas sus hojas están al mismo nivel y todos sus nodos interiores tienen cada uno 2 hijos. Un árbol binario de altura h puede tener como máximo 2 h -1 nodos. T POTIII 2.5.1 rboles inarios Un árbol binario es degenerado si todos sus nodos excepto el último tienen sólo un subárbol T
POTIII 2.5.2 Representación de rboles inarios mediante punteros IO IZQ R T S T S POTIII 2.5.2 Recorrido de árboles binarios Se denomina recorrido de un árbol al proceso que permite acceder una sola vez a cada uno de los nodos del árbol. uando un árbol se recorre, el conjunto completo de nodos se examina. Recorrido pre-orden 1. Visitar nodo raíz 2. Recorrer el subárbol izquierdo en pre-orden 3. Recorrer el subárbol derecho en pre-orden Recorrido in-orden 1. Recorrer el subárbol izquierdo en in-orden 2. Visitar nodo raíz 3. Recorrer el subárbol derecho en in-orden Recorrido post-orden 1. Recorrer el subárbol izquierdo en post-orden 2. Recorrer el subárbol derecho en post-orden 3. Visitar nodo raíz
POTIII 2.5.2.1 Recorrido pre-orden Recorrido pre-orden 1. Visitar nodo raíz 2. Recorrer el subárbol izquierdo en pre-orden 3. Recorrer el subárbol derecho en pre-orden I M O I M O POTIII 2.5.2.1 Recorrido in-orden Recorrido in-orden 1. Recorrer el subárbol izquierdo en in-orden 2. Visitar nodo raíz 3. Recorrer el subárbol derecho en in-orden I M O I M O
POTIII 2.5.2.1 Recorrido post-orden Recorrido post-orden 1. Recorrer el subárbol izquierdo en post-orden 2. Recorrer el subárbol derecho en post-orden 3. Visitar nodo raíz I M O I M O POTIII 2.5.3 - otaciones a notación algorítmica que utilizaremos es la siguiente: puntero_a <tipo de dato>:punt puntero_a nodo:punt registro: nodo entero:elem punt:izq, der fin_registro struct nodo{ int elem; struct nodo *izq, *der; reación de un árbol: struct nodo* rear(){ struct nodo* = (struct nodo*)malloc(sizeof(struct -> elem = 5; -> der=u; -> izq=u; return ; nodo));
POTIII jercicios (Recorrido de árboles) I M O void preorden(struct nodo *p){ struct pila *cima; printf("\n preorden:\n"); cima=u; push(&cima,u); while(p){ printf("%d-", p->elem); if(p->der){ push(&cima,p->der); if(p->izq){ p=p->izq; else{ p=pop(&cima); I M O POTIII jercicios (Recorrido de árboles) I M O void inorden(struct nodo *p){ struct pila *cima; printf("\n inorden:\n"); cima=u; push(&cima,u); while(cima){ while(p){ push(&cima,p); p=p->izq; if(cima){ p=pop(&cima); I M O if(cima)printf("%d-", p->elem); p=p->der;
POTIII jercicios (Recorrido de árboles) I M O void postorden(struct nodo *p){ struct pila *cima; printf("\n postorden:\n");cima=u; push(&cima,u); while(cima){ while(p){ push(&cima,p); if(p->der){ push(&cima,p->der); push(&cima,u); p=p->izq; p=pop(&cima); while(p){ printf("%d-", p->elem); p=pop(&cima); if(!p){ p=pop(&cima); I M O POTIII jercicios (Recorrido de árboles) void push(struct pila **cima, struct nodo *valor) { struct pila *nuevo; nuevo = (struct pila*)malloc(sizeof(struct pila)); nuevo->valor = valor; nuevo->sgte = *cima; *cima = nuevo; struct nodo* pop(struct pila **cima) { struct pila *p; struct nodo *v; p = *cima; if(!*cima){ return (U); else{ *cima = p->sgte; v = p->valor; free(p); return(v);
POTIII 2.5.4 rboles atados Se dice que un árbol binario está atado si cada nodo del árbol posee un campo adicional de tipo puntero direccionado (si el recorrido lo requiere) al nodo siguiente en un determinado recorrido (pre-orden, in-orden o postorden). xisten distintas formas de atar un árbol binario, pero cada una corresponderá al recorrido en cuestión. I M O POTIII 2.5.4 rboles atados tadura Unidireccional - -- - - -
POTIII 2.5.5 rboles binarios de búsqueda Supongamos que se tiene n claves distintas en orden ascendente 1, 2, 3,, n y que se tiene un árbol binario T de n nodos. Se define i como el iésimo nodo visitado si se recorre T en In-orden. uego si se almacena la clave i en el nodo i, el árbol resultante tiene la siguiente propiedad: Para cada nodo i con clave i, todas las claves en los nodos del subárbol izquierdo son menores que i y todas las claves en los nodos del subárbol derecho son mayores que i. i <i >i POTIII 2.5.5 rboles binarios de búsqueda sta propiedad garantiza que el recorrido in-orden de T dará una lista ordenada de los elementos de T. i <i >i I M O
POTIII 2.5.5 rboles binarios de búsqueda struct nodo* buscar(struct nodo *a, struct nodo **ant, int valor){ int enc; struct nodo *anterior; enc=0; anterior=u; while(!enc && (a)){ if(a->elem==valor){ enc=1; else{ anterior=a; if(valor<a->elem){ a=a->izq; else{ a=a->der; *ant=anterior; return a; POTIII 2.5.5 rboles binarios de búsqueda void insertar(struct nodo **a, int valor){ struct nodo *nuevo,*ant; /* uscar posicion de insercion */ p=buscar(*a, &ant, valor); if(!p){ /*crear nodo nuevo*/ nuevo = (struct nodo*)malloc(sizeof(struct nodo)); nuevo->elem = valor; nuevo->izq=nuevo->der=u; if(!ant){ *a=nuevo; else{ if(valor<ant->elem){ ant->izq=nuevo; else{ ant->der=nuevo; else{ printf("nodo ya esta en el arbol");
POTIII 2.5.5 rboles binarios de búsqueda void borrar(struct nodo **a, int valor) { struct nodo *a1,*ab, *padre,*actual,*nodo; int aux; actual=buscar(*a, &padre, valor); /* uscar posicion de eliminacion */ while(actual) { if(eshoja(actual)) { if(padre){ if(padre->der == actual){ /*odo a eliminar es hoja derecha*/ padre->der = U; else{ /*odo a eliminar es hoja izquierda*/ padre->izq = U; else *a=u; actual=u; free(actual); return; else{ padre = actual; if(actual->der) { /*buscar el nodo de mas a la izquierda del subarbol derecho*/ nodo = actual->der; while(nodo->izq) { padre = nodo; nodo = nodo->izq; else{ /*buscar el nodo de mas a la derecha del subarbol izquierdo */ nodo = actual->izq; while(nodo->der) { padre = nodo; nodo = nodo->der; aux = actual->elem; /* Intercambio */ actual->elem = nodo->elem; nodo->elem = aux; actual = nodo; POTIII 2.5.6 rboles V Se dice que un árbol binario está balanceado si y sólo si en cada nodo las alturas de sus 2 subárboles difieren como máximo en 1. Todos los árboles perfectamente balanceados son árboles V. O V V
POTIII 2.5.6 rboles V V M O O V V I P M O POTIII 2.5.6.1 Rotaciones través de rotaciones es posible transformar un árbol binario cualquiera en un árbol V. Rotación derecha simple T3 T1 T1 T2 T2 T3 ((T1 T2) T3) (T1 (T2 T3))
POTIII 2.5.6.1 Rotaciones Rotación izquierda simple T1 T3 T2 T3 T1 T2 (T1 (T2 T3)) ((T1 T2) T3) POTIII 2.5.6.1 Rotaciones Rotación derecha doble T4 T1 T1 T2 T3 T4 T2 T3 (T1 (T2 T3) T4) ((T1 T2) (T3 T4))
POTIII 2.5.6.1 Rotaciones Rotación izquierda doble T1 T4 T1 T2 T3 T4 T2 T3 (T1 (T2 T3) T4) ((T1 T2) (T3 T4)) POTIII jercicios (Rotaciones)
POTIII 2.5.7 rboles Se define un árbol como un árbol de orden m que cumple con las siguientes propiedades. ingún nodo tiene más de m hijos. ada nodo excepto la raíz tiene al menos m / 2 hijos. Todos los caminos desde la raíz a una hoja tienen la misma longitud. Todas las hojas están al mismo nivel. l número de claves en el nodo interno es uno menos que el número de sus hijos. POTIII 2.5.7 rboles 20 40 60 80 <20 20<<40 40<<60 4 9 14 19 24 29 34 39 0 1 2 3 5 6 7 8 10 11 12 13 Ventajas úsqueda más rápida Menor altura esventajas Insercíón y eliminación de datos
POTIII 2.5.7 Inserción en un árbol Para determinar el punto de inserción apropiado para el nuevo registro, considerar los siguientes pasos. Si el nodo en el cual se debe insertar el registro aún no ha excedido su capacidad (m-1 registros o claves) insertando o manteniendo el orden establecido. 40 20 60 80 20 40 60 80 POTIII 2.5.7 Inserción en un árbol Si el nodo en el cual se debe insertar el registro excede su capacidad producto de esta nueva inserción (overflow), se debe proceder a dividir el nodo según el siguiente criterio. onsiderar como si el nodo tuviera capacidad para n registros y por lo tanto n+1 hijos (punteros). 50 20 40 60 80 eterminar el registro medio de acuerdo a: Registro medio (RM): p/2 = (n + 1)/2 Registro medio (RM): 5/2 = (4 + 1)/2 = 3
POTIII 2.5.7 Inserción en un árbol Tomar el RM e insertarlo en el nodo padre. Producto de lo anterior, el nodo se dividirá en 2 y el nodo padre quedará con un hijo más. 50 20 40 60 80 50 20 40 60 80 POTIII 2.5.7 Inserción en un árbol 380 395 430 480 406 412 451 472 493 506 511 Árbol de orden 5 395 430 480 espués de insertar 382 380 382 406 412 451 472 493 506 511 395 430 480 508 espués de insertar 518 y 508 380 382 406 412 451 472 493 506 511 518
POTIII 2.5.7 rboles * ay diversas formas de mejorar la utilización del almacenamiento en un árbol. Un método es retrasar la división de un nodo cuando se desborda. n lugar de eso, se redistribuyen en forma uniforme las claves en el nodo y en uno de sus hermanos adyacentes. 100 Árbol de orden 7 10 20 30 40 50 60 110 120 130 50 espués de insertar 35 se redistribuyen los hermanos 10 20 30 35 40 60 100 110 120 130 POTIII 2.5.7 rboles + Una de las principales desventajas del árbol es la dificultad de recorrer las claves en forma secuencial. l árbol +, conserva la propiedad de acceso aleatorio rápido del árbol, al mismo tiempo que permite un acceso secuencial rápido. 98 36 53 81 104 119 8 17 36 42 53 56 65 72 81 83 96 98 102 104 107 112 119 125 127 R8 R17 R36 R42 R53 R56 R65 R72 R81 R83 R96 R98 R 102 R 104 R 107 R 112 R 119 R 125 R 127