Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
ESTRUCTURAS DE DATOS
INTRODUCCION
Los rboles
CONCEPTO
A es Padre
B y C hijos de A:
hermanos
B es Padre
D, E, F hijos de B
p es el padre y m es el hijo
B
D
Un subrbol de un rbol
A
C
TERMINOLOGIA
Es el numero de nodos entre la raz y el nodo mas profundo del rbol, la altura
del un rbol entonces
Valores:
Conjunto de elementos, donde SOLO se conoce el nodo raz
Un nodo puede almacenar contenido y estar enlazado con
Eliminar un rbol
Recorrer un rbol
void PreOrden(Arbol A)
void EnOrden(Arbol A)
void PostOrden(Arbol A)
ARBOLES BINARIOS
Un nodo raz y
RAIZ
A
B
D
H
C
E
Sub. Izq.
G
J
Sub. Der.
DEFINICIONES RECURSIVAS
Se basa en si misma
nivel 1
SUB. DER.
Nivel 1
D
E
Caso Bsico
Un rbol con un solo
nodo tiene nivel 1
S. izq.
Nivel 1
A
B
S. der.
Nivel 1
SUB.
IZQ.
SUB. IZQ.
SUB. IZQ.
Nivel
=
NivelSUB.
= 31 DER..
+
Nivel
=
1
Max(0,2) +
Max(0,Sub.Izq)
Nivel = 1
Max(0,Sub.Izq.)
Max(0,1)
NIVEL
:MAX(S.IZQ,
1 + MAX(3,
1)
NIVEL
: 1 +NIVEL
:4
S.DER)
Caso Recursivo
Si tiene mas de un nodo, el nivel es:
1 + MAX(Nivel(SubIzq), Nivel(SubDer))
Recursiva
Si T esta vaco,
ARBOLES BINARIOS
COMPLETOS
OTROS
RECORRIDOS DE UN A.B.
Recorrer es
1. Visitar raiz
2. Preorden al Subarbol Izq.
3. Preorden al Subarbol Der.
EJEMPLO PREORDEN
G
1
12
10
13
I
11
G-D-B-A-C-E
G-D-B-A-C
G-D-B-A
G-D-B
G-D
G
G-D-B-A-C-E-F
G-D-B-A-C-E-F-K
G-D-B-A-C-E-F-K-H
G-D-B-A-C-E-F-K-H-J
G-D-B-A-C-E-F-K-H-J-I
G-D-B-A-C-E-F-K-H-J-I-M
G-D-B-A-C-E-F-K-H-J-I-M-L
AB y NODOAB: DEFINICION
FORMAL
<ab>::= nulo | <nodo>
<nodoab>::=<contenido>+<izq>+<der>
<izq>::=<ab>
<der>::=<ab>
<contenido>::<<dato>>|{<<dato>>}
AB Y NODOAB:
DECLARACION
Cada nodo
Tiene Contenido y
Un nodo en un rbol tiene mas punteros a null que un nodo de una lista
NODOAB: OPERACIONES
Operaciones Bsicas
NODOAB: MAS
OPERACIONES
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);
AB A;
AB_Vaciar(&A);
A = NodoAB_CrearHoja(Generico_CrearEntero(1));
A
1
RECORRIDOS:
IMPLEMENTACION
Caso Bsico
Si AB_EstaVacio(raiz)
Terminar de recorrer
Caso Recursivo
Si !AB_EstaVacio(raiz)
AB_EnOrden(raiz->izq);
Mostrar raiz->I
AB_EnOrden(raiz->der);
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
Arbol
ArbolVacio!,
Vacio!,Terminar
Terminar
4
B
APLICACIN: EVALUACION
DE EXPRESIONES
ARBOL DE EXPRESION
Ejemplo: (a+b)
(a+b)*c
*
+
a
+
a
c
b
EJERCICIO EN CLASE
[X+(Y*Z)] * (A-B)
+
c
CREAR UN ARBOL DE
EXPRESION
Al revisar un operador, recuerdo las dos ultimas hojas creadas y uno todo
No debo olvidar el nuevo arbolito que he creado
A*B-C*D+H
AB*CD*-H+
+
-
D
H
B
C
*
A
D
A
A
*
*
B
EVALUACION DE LA EXP.
POSTFIJA
PostOrden
+
-
*
A
Si no
A*
(A
y*BB) y- (C*D)
CyD+
(C*D)
y HH
ARBOL BINARIO DE
BUSQUEDA
<>
55
30
75
41
85
Dado un nodo:
Todos los nodos del sub. Izq. Tienen una clave menor que
la clave de la raiz
Todos los nodos del sub. Der. Tienen una clave mayor que
la clave de la raiz
<>
6
4
9
5
Valores:
Conjunto de elementos
Dado un nodo p,
Operaciones
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
Ejemplo:
8, 3, 1, 20, 10, 5, 4
8
20
5
4
10
EJERCICIO EN CLASE
12, 8, 7, 16, 11
BUSQUEDA DE UN NODO
No se encontro
Buscar(raiz,25)
Buscar(raiz,5)
BINGO, LO ENCONTRE
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
20
5
4
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
Insertar(raiz,15)
15>8der
Pasos:
15<20izq
8
15>10
der
3
1
10
20
Insertar
aqui
4
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{
}
return TRUE;
ELIMINACION DE UN
NODO
Eliminar(raiz,34)
Pasos:
Si no
34
28
18
90
25
20
100
28
nmayor
if((*A)->der == NULL)
(*A) = (*A)->izq;
else if((*A)->izq == NULL)
(*A) = (*A)->der;
else
tmp = ABB_SacarRaiz(A);
return tmp;
}