ESTRUCTURAS DE DATOS
INTRODUCCION
Las listas enlazadas son estructuras lineales
Son flexibles pero son secuenciales, un elemento detrs de otro
Los rboles
Junto con los grafos son estructuras de datos no lineales Superan las desventajas de las listas Sus elementos se pueden recorrer de distintas formas, no necesariamente uno detrs de otro
CONCEPTO
Estructura que organiza sus elementos formando jerarquas: PADRES E HIJOS Los elementos de un rbol se llaman nodos Si un nodo p tiene un enlace con un nodo m,
p es el padre y m es el hijo Los hijos de un mismo padre se llaman: hermanos
A B D E F C
Todos los nodos tienen al menos un padre, menos la raz: A Si no tienen hijos se llaman hoja: D, E, F y C Un subrbol de un rbol Es cualquier nodo del rbol junto con todos sus descendientes
B D E F
TERMINOLOGIA
Camino: Secuencia de nodos conectados dentro de un arbol Longitud del camino: es el numero de nodos menos 1 en un camino Altura del rbol: es el nivel mas alto del rbol
Un rbol con un solo nodo tiene altura 1
Grado(aridad) de un nodo: es numero de hijos del nodo Grado(aridad) de un rbol: mxima aridad de sus nodos
Eliminar un rbol
void Arbol_Eliminar(Arbol *A);
Recorrer un rbol
void PreOrden(Arbol A) void EnOrden(Arbol A) void PostOrden(Arbol A)
ARBOLES BINARIOS
Tipo especial de rbol
Cada nodo no puede tener mas de dos hijos B
A C D
RAIZ
A C E F J
Sub. Der.
Sub. Izq.
DEFINICIONES RECURSIVAS
La definicin del rbol es recursiva
Se basa en si misma
B D E A SUB. DER. Nivel 1 C
SUB. IZQ. SUB. SUB. IZQ. Nivel = 3 + Nivel = 1 DER.. SUB. Nivel = 1 + Max(0,2) Max(0,Sub.Izq) Nivel = Max(0,Sub.Izq.) Max(0,1) 1
NIVEL : 1 +:MAX(S.IZQ, S.DER) NIVEL NIVEL : 4 1 + MAX(3, 1)
Recursiva
Si T esta vaco,
Entonces T es un rbol binario lleno de altura 0
OTROS
Un rbol equilibrado es cuando
La diferencia de altura entre los subrboles de cualquier nodo es mximo 1
RECORRIDOS DE UN A.B.
Recorrer es
Visitar todos los elementos de una estructura
EJEMPLO PREORDEN
G
1
D
2
K
8
B
3
E
6
H
9
M
12
A
4
C
5
F
7
J
10
L
13
I
11
G-D-B-A-C-E-F-K-H-J-I-M G-D-B-A-C-E-F-K-H-J-I G-D-B-A-C-E-F-K-H-J G-D-B-A-C-E-F-K-H G-D-B-A-C-E-F-K G-D-B-A-C-E-F G-D-B-A-C-E G-D-B-A-C G-D-B-A G-D-B G-D G-D-B-A-C-E-F-K-H-J-I-M-L
AB Y NODOAB: DECLARACION
Un rbol binario: conjunto de nodos
Solo se necesita conocer el nodo raz
Cada nodo
Tiene Contenido y
NODOAB: OPERACIONES
Elemento de un rbol que
Almacena informacin (contenido), Conoce hijo izq. y derecho, ambos son nodos
Operaciones Bsicas
Crear un nuevo nodo hoja y eliminar hoja existente
NodoAB *NodoAB_CrearHoja(Generico G); void NodoAB_Eliminar (NodoArbol **A);
AB: OPERACIONES
Crear y Eliminar
AB_Vaciar(AB *A); AB_Eliminar(AB *A);
Recorridos
void AB_PreOrden(AB A); void AB_PosOrden(ABl A); void AB_EnOrden(AB A);
A 1
RECORRIDOS: IMPLEMENTACION
Como ya revisamos, las operaciones de recorrido son recursivas Ejemplo: EnOrden
Recorrer EnOrden al subarbol izquierdo Visitar nodo raiz Recorrer EnOrden al subarbol derecho
OPERACION ENORDEN
void AB_EnOrden(AB A, Generico_fnImprimir imprimir){ if(!AB_EstaVacio(A)){ AB_EnOrden(A->izq,imprimir); imprimir(A->G); AB_EnOrden(A->der,imprimir); } }
A
4
B C
2
D E F
6
G
ARBOL DE EXPRESION
Arboles que representan expresiones en memoria
Todos los operadores tienen dos operandos
La raiz puede contener el operador Hijo izq: operando 1, Hijo derecho: operando 2
Ejemplo: (a+b)
+
(a+b)*c * + c b
b a
EJERCICIO EN CLASE
Construya arboles de expresion para:
[X+(Y*Z)] * (A-B)
A*B-C*D+H
D H B A C
AB*CD*-H+
* * A B C D A * B C A * D * B C *
+ H
<> 55 30 4 41 75 85
<> 6 4 5 9
Los nodos del arbol izquierdo almacenan valores mayores al de p Los nodos del arbol derecho almacenan valores menores al de p
Operaciones
Son las mismas operaciones que para un AB Pero en este caso ya tenemos reglas suficientes que nos indican como:
Insertar Sacar y Buscar
typedef struct ABB_Nodo{ Generico clave, G; ABB_Nodo *izq, *der; }ABB_Nodo;
Ejemplo
NodoAB *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 ABB
Un arbol de busqueda debe mantener
A la derecha mayor a raiz A la izq. Menor a raiz
Ejemplo:
Construya arbol con los siguientes elementos:
8, 3, 1, 20, 10, 5, 4 8 3 1 4 5 10 20
EJERCICIO EN CLASE
Construya el arbol para almacenar:
12, 8, 7, 16, 11
BUSQUEDA DE UN NODO
Dada una clave, devolver el nodo que la contiene Se comienza en la raiz
Si el arbol esta vacio
No se encontro Buscar(raiz,25) Buscar(raiz,5)
Si no
Si la clave buscada es mayor a la del nodo evaluado Buscar en el subarbol derecho Si no 1 Buscar en el subarbol izquierdo 3 5 4
8 20 10
No existe
IMPLEMENTACION DE LA BUSQUEDA
NodoABB *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); else return ABB_Buscar(A->izq, clave, comp); }
INSERCION DE UN NODO
Muy parecido a la busqueda Debo insertar en la posicion correcta
El arbol debe mantener sus propiedades
Insertar(raiz,15)
15>8 der izq
8 3
15>10 der
15<20
Pasos:
Crear una nueva hoja Buscar en el arbol donde ponerla Enlazar el nuevo nodo al arbol
1
20
Insertar aqui
5 4
10
15
IMPLEMENTACION DE LA INSERCION
bool 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) <0) ABB_Insertar((*A)->izq,nuevo,f); else return FALSE; } else{ //Si esta vacio, alli insertar *A = nuevo; } return TRUE; }
ELIMINACION DE UN NODO
Es mas compleja que la insercion Al sacar un nodo del arbol
El arbol debe mantener sus propiedades El arbol debe reajustarse
Eliminar(raiz,34)
28 34 18 6 20 25 28
nmayor
90 100
Pasos:
Buscar el nodo p que se va a eliminar
Si el nodo a eliminar tiene menos de dos hijos Subir el nodo hijo a la pos. del nodo eliminado
Si no
Ubicar el nodo q con la mayor de las claves menores Reemplazar contenido de p con el del nodo q Eliminar el nodo q que se encontro el el primer paso