SlideShare una empresa de Scribd logo
1 de 39
ARBOLES
ESTRUCTURAS DE DATOS
INTRODUCCION
 Las listas enlazadas son estructuras lineales
 Son flexibles pero son secuenciales, un elemento detrás 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 detrás de otro
 Son muy útiles para la búsqueda y recuperación de
información
CONCEPTO
 Estructura que organiza sus elementos formando
jerarquías: PADRES E HIJOS
 Un subárbol de un árbol
 Es cualquier nodo del árbol junto con todos sus
descendientes
 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
C
F
 Todos los nodos tienen al menos un padre, menos la raíz: A
 Si no tienen hijos se llaman hoja: D, E, F y C
B
D E F
A es Padre
B y C hijos de A:
hermanos
B es Padre
D, E, F hijos de B
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
 Nivel(profundidad) de un nodo: es el numero de nodos entre el nodo
y la raíz.
 Nivel de un árbol
 Es el numero de nodos entre la raíz y el nodo mas profundo del árbol, la altura
del un árbol entonces
 Grado(aridad) de un nodo: es numero de hijos del nodo
 Grado(aridad) de un árbol: máxima aridad de sus nodos
TDA ARBOL : DEFINICION
INFORMAL
 Valores:
 Conjunto de elementos, donde SOLO se conoce el nodo raíz
 Un nodo puede almacenar contenido y estar enlazado con
 Sus árboles hijos (pueden ser dos o varios)
 Operaciones: Dependen del tipo de árbol, pero en general tenemos
 Vaciar o inicializar el Arbol
 void Arbol_Vaciar (Arbol *A);
 Eliminar un árbol
 void Arbol_Eliminar(Arbol *A);
 Saber si un árbol esta vacío
 bool Arbol_EstaVacio(ArbolA);
 Recorrer un árbol
 void PreOrden(Arbol A)
 void EnOrden(Arbol A)
 void PostOrden(Arbol A)
TDA ARBOL: DEFINICION
FORMAL
<arbol> ::= <<NULL>> | <nodo>
<nodo> ::= <contenido>{<arbol>}
<contenido> ::= <<dato>>{<<dato>>}
ARBOLES BINARIOS
 Tipo especial de árbol
 Cada nodo no puede tener mas de dos hijos
 Un árbol puede ser un conjunto
 Vacío, no tiene ningún nodo
 O constar de tres partes:
 Un nodo raíz y
 Dos subárboles binarios: izquierdo y derecho
 La definición de un árbol binario es recursiva
 La definición global depende de si misma
A
B C
D
A
B C
D E
H I
F G
J
RAIZ
Sub. Izq. Sub. Der.
DEFINICIONES
RECURSIVAS
 La definición del árbol es recursiva
 Se basa en si misma
 La terminología de los árboles
 También puede ser definida en forma recursiva
 Ejemplo: NIVEL de un árbol
 Identificar el caso recursivo y el caso mas básico
A
nivel 1
Caso Básico
Un árbol con un solo
nodo tiene nivel 1
Caso Recursivo
Si tiene mas de un nodo, el nivel es:
1 + MAX(Nivel(SubIzq), Nivel(SubDer))
S. izq.
Nivel 1
S. der.
Nivel 1
A
B C
Nivel Del Arbol: 2
SUB. IZQ.
Nivel = 1 +
Max(0,Sub.Izq)
SUB. DER.
Nivel 1
SUB. IZQ.
Nivel = 1 +
Max(0,Sub.Izq.)
SUB. DER..
Nivel = 1
SUB. IZQ.
Nivel = 1 +
Max(0,1)
A
B C
D
E
SUB. IZQ.
Nivel = 1 +
Max(0,2)
NIVEL : 1 + MAX(S.IZQ, S.DER)
NIVEL : 1 + MAX(3, 1)
NIVEL : 4
SUB. IZQ.
Nivel = 3
ARBOLES BINARIOS
LLENOS
 Un árbol de altura h, esta lleno si
 Todas sus hojas esta en el nivel h
 Los nodos de altura menor a h tienen siempre 2 hijos
 Recursiva
 Si T esta vacío,
 Entonces T es un árbol binario lleno de altura 0
 Si no esta vacío, y tiene h>0
 Esta lleno si los subárboles de la raíz, son ambos árboles
binarios llenos de altura h-1
ARBOLES BINARIOS
COMPLETOS
 Un arbol de altura h esta completo si
 Todos los nodos hasta el nivel h-2 tienen
dos hijos cada uno y
 En el nivel h-1, si un nodo tiene un hijo
derecho, todas las hojas de su subarbol
izquierdo están a nivel h
 Si un arbol esta lleno, tambien esta
completo
OTROS
 Un árbol equilibrado es cuando
 La diferencia de altura entre los subárboles de cualquier nodo es
máximo 1
 Un árbol binario equilibrado totalmente
 Los subárboles izquierdo y derecho de cada nodo tienen las
misma altura: es un árbol lleno
 Un árbol completo es equilibrado
 Un árbol lleno es totalmente equilibrado
RECORRIDOS DE UN A.B.
 Recorrer es
 Visitar todos los elementos de una estructura
 Como recorrer un árbol
 Hay tantos caminos, cual escoger?
 Existe tres recorridos típicos
 Nombrados de acuerdo a la posición de la raíz
 Preorden: raíz - subarbol izq. - subarbol der.
 Enorden : subarbol izq. - raíz - subarbol der.
 Postorden : subarbol izq. - subarbol der. -raíz
EJEMPLO PREORDEN
G
G-D
G-D-B
G-D-B-A
G-D-B-A-C
G-D-B-A-C-E
G
D K
B E H M
A C F J
I
L
G
1
D
2
B
3
A
4
C
5
E
6
F
7
G-D-B-A-C-E-F
K
8
G-D-B-A-C-E-F-K
H
9
G-D-B-A-C-E-F-K-H
J
10
G-D-B-A-C-E-F-K-H-J
I
11
G-D-B-A-C-E-F-K-H-J-I
M
12
G-D-B-A-C-E-F-K-H-J-I-M
L
13
G-D-B-A-C-E-F-K-H-J-I-M-L
1. Visitar raiz
2. Preorden al Subarbol Izq.
3. Preorden al Subarbol Der.
AB y NODOAB: DEFINICION
FORMAL
<ab>::= nulo | <nodo>
<nodoab>::=<contenido>+<izq>+<der>
<izq>::=<ab>
<der>::=<ab>
<contenido>::<<dato>>|{<<dato>>}
AB Y NODOAB:
DECLARACION
 Un árbol binario: conjunto de nodos
 Solo se necesita conocer el nodo raíz
 Cada nodo
 Tiene Contenido y
 Dos enlaces: árbol hijo izquierdo, árbol hijo derecho
 Un nodo hoja, es aquel cuyos dos enlaces apunta a null
 Un nodo en un árbol tiene mas punteros a null que un nodo de una lista
 De un árbol solo se necesita conocer su raíz
 La raíz, que es un nodo, puede definir al árbol o
typedef struct NodoAB{
Generico G;
NodoAB *izq, *der;
}NodoAB;
typedef struct NodoAB *AB;
NODOAB: OPERACIONES
 Elemento de un árbol que
 Almacena información (contenido),
 Conoce hijo izq. y derecho, ambos son nodos
 Operaciones Básicas
 Crear un nuevo nodo hoja y eliminar hoja existente
 NodoAB *NodoAB_CrearHoja(Generico G);
 void NodoAB_Eliminar (NodoArbol **A);
 Saber si el nodo es o no hoja
 bool NodoAB_EsHoja(NodoArbol *p);
NODOAB: MAS
OPERACIONES
 Consultas de los campos de un nodo
 Generico NodoAB_ConsultaContenido(NodoAB *nodo);
 NodoAB *NodoAB_Izq (NodoAB *nodo);
 NodoAB *NodoAB_Der(NodoAB *nodo);
 Cambiar los campos de un nodo
 void NodoAB_SetContenido (NodoAB *nodo , Generico G);
 void NodoAB_SetIzq(NodoAB *nodo, NodoAB *enlace);
 void NodoAB_SetDer(NodoAB *nodo, NodoAB *enlace);
AB: CREAR NODO HOJA
 Se debe crear un nodo nuevito: un nodo hoja
NodoAB *NuevaHoja(Generico G){
NodoAB *nuevo;
nuevo = (NodoAB *)malloc(sizeof(NodoAB));
nuevo->G = G;
nuevo->izq = NULL;
nuevo->der= NULL;
return nuevo;
}
AB: OPERACIONES
 Crear y Eliminar
 AB_Vaciar(AB *A);
 AB_Eliminar(AB *A);
 Estado del Arbol
 bool AB_EstaVacio(AB A);
 Añadir 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 contenido
 NodoArbol *AB_Buscar(AB A, Generico G, Generico_fnComparar fn );
 Recorridos
 void AB_PreOrden(AB A);
 void AB_PosOrden(ABl A);
 void AB_EnOrden(AB A);
AB: INSTANCIANDO Y CREANDO
 Un Arbol Vacío, es aquel cuyo nodo raíz apunta a NULL
void AB_Vaciar(AB *A){
*A = NULL;
}
 Para crear una variable tipo Arbol, y empezarla a usar:
 Instanciarlo (crear variable)
 Vaciar el árbol
 Para añadirle una hoja al árbol, crear hoja:
AB A;
AB_Vaciar(&A);
A = NodoAB_CrearHoja(Generico_CrearEntero(1)); 1
A
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
 En todo algoritmo recursivo debemos buscar dos casos
 Básico, para terminar la recursividad
 Recursivo, donde la función se llama a si misma
Caso Básico
 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
B C
D E F G
Arbol Vacio!, Terminar
D
1
Arbol Vacio!, Terminar
B
2
Arbol Vacio!, Terminar
E
3
Arbol Vacio!, Terminar
A
4
F
5
Arbol Vacio!, Terminar
C
6
Arbol Vacio!, Terminar
G
7
Arbol Vacio!, Terminar
Arbol Vacio!, Terminar
APLICACIÓN: EVALUACION
DE EXPRESIONES
 Ya sabemos lo de las expresiones, cierto?
 InFija, operador en medio
 PreFija, operador antes de dos operandos
 PosFija, operador luego de dos operandos
 Para evaluar una expresion dada, podriamos
 Pasarla a posfija y usar solo pilas
 Pasarla a posfija y usar pilas y un arbol de expresion
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
(a+b)*c
+
a b
c
*
EJERCICIO EN CLASE
 Construya arboles de expresion para:
 [X+(Y*Z)] * (A-B)
 Deducir las expresiones de los siguientes A.B.
+
a *
b -
+
c d
EVALUAR UNA EXPRESION
ARTIMETICA EN INFIJA
 La expresion se transforma a la expresion posfija
 Esto, ya sabemos como hacer
 Crear un arbol de expresion
 Para esto se va a usar una pila y un arbol de caracteres
 Usando el arbol, evaluar la expresion
CREAR UN ARBOL DE
EXPRESION
 Los operandos seran siempre nodos hoja del arbol
 Al revisar un operando, creo una nueva hoja y la recuerdo
 Los operadores seran nodos padre
 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+
A
B *
B
A
C
D
*
D
C
-
*
D
C
*
B
A
H
+
-
*
D
C
*
B
A
H
EVALUACION DE LA EXP.
POSTFIJA
 Lo ideal es recuperar los dos operandos, el operador, y ejecutar la opcion
 Que recorrido es el ideal?
 PostOrden
+
-
*
D
C
*
B
A
H
Para evaluar el arbol:
Si el arbol tiene un solo nodo y este almacena un
operando
El resultado de la evaluacion es el valor de ese
operando
Si no
1. Res1 = Evaluo subarbol izquierdo
2. Res2 = Evaluo subarbol derecho
3. Recupero la info de la raiz y efectuo la
operación alli indicada, entre Res1 y Res2
A
A y B
A * 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
BUSQUEDA
 Los elementos en un arbol
 Hasta ahora no han guardado un orden
 No sirven para buscar elementos
 Los arboles de busqueda
 Permiten ejecutar en ellos busqueda binaria
 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
4
5
9
6
<>
30
41
75
55
4 85
<>
TDA ABB: DEFINICION
 Valores:
 Conjunto de elementos
 Dado un nodo p,
 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
<abb>::= NULL | <abb_nodo>
<abb_nodo>::=<clave>+<contenido>+<izq>+<der>
<izq>::=<abb>
<der>::=<abb>
<clave>::<<dato>>|{<<dato>>}
<contenido>::<<dato>>|{<<dato>>}
typedef struct ABB_Nodo{
Generico clave, G;
ABB_Nodo *izq, *der;
}ABB_Nodo;
CREAR CON CLAVE
 Como el nodo ahora tiene un campo clave
 Cambian un poco las operaciones del 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
20
10
5
4
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
 Si clave buscada es igual a la clave del nodo evaluado
 BINGO, LO ENCONTRE
 Si no
 Si la clave buscada es mayor a la del nodo evaluado
 Buscar en el subarbol derecho
 Si no
 Buscar en el subarbol izquierdo
8
3
1
20
10
5
4
Buscar(raiz,5)
5
5
Buscar(raiz,25)
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
 Pasos:
 Crear una nueva hoja
 Buscar en el arbol donde ponerla
 Enlazar el nuevo nodo al arbol
8
3
1
20
10
5
4
Insertar(raiz,15)
15>8…der
15<20…izq
15>10
…der
Insertar
aqui
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
 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
34
18
6
90
28
25
20
100
Eliminar(raiz,34)
34
nmayor
28
28
SACAR NODO: CODIGO
NodoABB *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;
else
tmp = ABB_SacarRaiz(A);
return tmp;
}

Más contenido relacionado

Similar a 12. Arboles.ppt

Similar a 12. Arboles.ppt (20)

Arboles presentacion
Arboles presentacionArboles presentacion
Arboles presentacion
 
Programacion estructura de arboles en c
Programacion estructura de arboles en cProgramacion estructura de arboles en c
Programacion estructura de arboles en c
 
Árboles Binarios
Árboles BinariosÁrboles Binarios
Árboles Binarios
 
Sustentacion arboles
Sustentacion arbolesSustentacion arboles
Sustentacion arboles
 
Lider zambrano 4to s
Lider zambrano 4to sLider zambrano 4to s
Lider zambrano 4to s
 
áRboles binarios
áRboles binariosáRboles binarios
áRboles binarios
 
áRboles binarios
áRboles binariosáRboles binarios
áRboles binarios
 
Exposición fundamentos de probabilidad
Exposición fundamentos de probabilidadExposición fundamentos de probabilidad
Exposición fundamentos de probabilidad
 
Arboles.pdf
Arboles.pdfArboles.pdf
Arboles.pdf
 
GRAFOS
GRAFOSGRAFOS
GRAFOS
 
Trees dts
Trees dtsTrees dts
Trees dts
 
arboles_bin.pdf
arboles_bin.pdfarboles_bin.pdf
arboles_bin.pdf
 
tema4.pdf
tema4.pdftema4.pdf
tema4.pdf
 
Arboles
ArbolesArboles
Arboles
 
1 árbol
1 árbol1 árbol
1 árbol
 
Arboles
ArbolesArboles
Arboles
 
Arboles
ArbolesArboles
Arboles
 
Diapositiva de prueba
Diapositiva de pruebaDiapositiva de prueba
Diapositiva de prueba
 
Estructura de Datos - Unidad IV: Estructuras no Lineales
Estructura de Datos - Unidad IV: Estructuras no LinealesEstructura de Datos - Unidad IV: Estructuras no Lineales
Estructura de Datos - Unidad IV: Estructuras no Lineales
 
Para leer estructuras
Para leer estructurasPara leer estructuras
Para leer estructuras
 

Más de DEMSSHILLLEONELCOUTI

Más de DEMSSHILLLEONELCOUTI (9)

procesamiento de datos con python para resolucion de ciencia de datos, aplica...
procesamiento de datos con python para resolucion de ciencia de datos, aplica...procesamiento de datos con python para resolucion de ciencia de datos, aplica...
procesamiento de datos con python para resolucion de ciencia de datos, aplica...
 
tema de logica de logica de predicados para la aplicacion de inteligencia art...
tema de logica de logica de predicados para la aplicacion de inteligencia art...tema de logica de logica de predicados para la aplicacion de inteligencia art...
tema de logica de logica de predicados para la aplicacion de inteligencia art...
 
finitos.pptx
finitos.pptxfinitos.pptx
finitos.pptx
 
python CIENTIFIFO.pdf
python CIENTIFIFO.pdfpython CIENTIFIFO.pdf
python CIENTIFIFO.pdf
 
SIMBOLOS PARA REALIZAR DERIVACIONES.pdf
SIMBOLOS PARA REALIZAR DERIVACIONES.pdfSIMBOLOS PARA REALIZAR DERIVACIONES.pdf
SIMBOLOS PARA REALIZAR DERIVACIONES.pdf
 
CICLO_DE_VIDA_DEL_SOFTWARE.pptx
CICLO_DE_VIDA_DEL_SOFTWARE.pptxCICLO_DE_VIDA_DEL_SOFTWARE.pptx
CICLO_DE_VIDA_DEL_SOFTWARE.pptx
 
Algoritmos.pdf
Algoritmos.pdfAlgoritmos.pdf
Algoritmos.pdf
 
Tecnologias WEB.pdf
Tecnologias WEB.pdfTecnologias WEB.pdf
Tecnologias WEB.pdf
 
RED.pptx
RED.pptxRED.pptx
RED.pptx
 

Último

Ivu- taller de diseño arquitectonico l , adicion y sustraccion de cubos,
Ivu- taller de diseño arquitectonico l , adicion y sustraccion de cubos,Ivu- taller de diseño arquitectonico l , adicion y sustraccion de cubos,
Ivu- taller de diseño arquitectonico l , adicion y sustraccion de cubos,juberrodasflores
 
que son los planes de ordenamiento predial POP.pptx
que son los planes de ordenamiento predial  POP.pptxque son los planes de ordenamiento predial  POP.pptx
que son los planes de ordenamiento predial POP.pptxSergiothaine2
 
2024 2024 202420242024PPT SESIÓN 03.pptx
2024 2024 202420242024PPT SESIÓN 03.pptx2024 2024 202420242024PPT SESIÓN 03.pptx
2024 2024 202420242024PPT SESIÓN 03.pptxccordovato
 
LA LEY DE LAS XII TABLAS en el curso de derecho
LA LEY DE LAS XII TABLAS en el curso de derechoLA LEY DE LAS XII TABLAS en el curso de derecho
LA LEY DE LAS XII TABLAS en el curso de derechojuliosabino1
 
SUNEDU - Superintendencia Nacional de Educación superior Universitaria
SUNEDU - Superintendencia Nacional de Educación superior UniversitariaSUNEDU - Superintendencia Nacional de Educación superior Universitaria
SUNEDU - Superintendencia Nacional de Educación superior Universitariachayananazcosimeon
 
REPORTE-HEMEROGRÁFICO-MARZO-2024-IRAPUATO-¿CÓMO VAMOS?.pdf
REPORTE-HEMEROGRÁFICO-MARZO-2024-IRAPUATO-¿CÓMO VAMOS?.pdfREPORTE-HEMEROGRÁFICO-MARZO-2024-IRAPUATO-¿CÓMO VAMOS?.pdf
REPORTE-HEMEROGRÁFICO-MARZO-2024-IRAPUATO-¿CÓMO VAMOS?.pdfIrapuatoCmovamos
 
El Teatro musical (qué es, cuál es su historia y trayectoria...)
El Teatro musical (qué es, cuál es su historia y trayectoria...)El Teatro musical (qué es, cuál es su historia y trayectoria...)
El Teatro musical (qué es, cuál es su historia y trayectoria...)estebancitoherrera
 
HABILESASAMBLEA Para negocios independientes.pdf
HABILESASAMBLEA Para negocios independientes.pdfHABILESASAMBLEA Para negocios independientes.pdf
HABILESASAMBLEA Para negocios independientes.pdfGEINER22
 
CUESTIONARIO A ADICCION A REDES SOCIALES.pdf
CUESTIONARIO A ADICCION A REDES SOCIALES.pdfCUESTIONARIO A ADICCION A REDES SOCIALES.pdf
CUESTIONARIO A ADICCION A REDES SOCIALES.pdfEDUARDO MAMANI MAMANI
 
CAPACITACION_higiene_industrial (1).ppt...
CAPACITACION_higiene_industrial (1).ppt...CAPACITACION_higiene_industrial (1).ppt...
CAPACITACION_higiene_industrial (1).ppt...jhoecabanillas12
 
La importancia de las pruebas de producto para tu empresa
La importancia de las pruebas de producto para tu empresaLa importancia de las pruebas de producto para tu empresa
La importancia de las pruebas de producto para tu empresamerca6
 
REPORTE DE INCIDENCIA DELICTIVA MARZO 2024.pdf
REPORTE DE INCIDENCIA DELICTIVA MARZO 2024.pdfREPORTE DE INCIDENCIA DELICTIVA MARZO 2024.pdf
REPORTE DE INCIDENCIA DELICTIVA MARZO 2024.pdfIrapuatoCmovamos
 
Data Warehouse.gestion de bases de datos
Data Warehouse.gestion de bases de datosData Warehouse.gestion de bases de datos
Data Warehouse.gestion de bases de datosssuser948499
 
PREGRADO-PRESENCIAL-FASE-C-202401 (1).pdf
PREGRADO-PRESENCIAL-FASE-C-202401 (1).pdfPREGRADO-PRESENCIAL-FASE-C-202401 (1).pdf
PREGRADO-PRESENCIAL-FASE-C-202401 (1).pdfluisccollana
 
tipos de organización y sus objetivos y aplicación
tipos de organización y sus objetivos y aplicacióntipos de organización y sus objetivos y aplicación
tipos de organización y sus objetivos y aplicaciónJonathanAntonioMaldo
 
bases-cye-2024(2) una sola descarga en base de feria de
bases-cye-2024(2) una sola descarga en base de feria debases-cye-2024(2) una sola descarga en base de feria de
bases-cye-2024(2) una sola descarga en base de feria deCalet Cáceres Vergara
 
17 PRACTICAS - MODALIDAAD FAMILIAAR.docx
17 PRACTICAS - MODALIDAAD FAMILIAAR.docx17 PRACTICAS - MODALIDAAD FAMILIAAR.docx
17 PRACTICAS - MODALIDAAD FAMILIAAR.docxmarthaarroyo16
 

Último (17)

Ivu- taller de diseño arquitectonico l , adicion y sustraccion de cubos,
Ivu- taller de diseño arquitectonico l , adicion y sustraccion de cubos,Ivu- taller de diseño arquitectonico l , adicion y sustraccion de cubos,
Ivu- taller de diseño arquitectonico l , adicion y sustraccion de cubos,
 
que son los planes de ordenamiento predial POP.pptx
que son los planes de ordenamiento predial  POP.pptxque son los planes de ordenamiento predial  POP.pptx
que son los planes de ordenamiento predial POP.pptx
 
2024 2024 202420242024PPT SESIÓN 03.pptx
2024 2024 202420242024PPT SESIÓN 03.pptx2024 2024 202420242024PPT SESIÓN 03.pptx
2024 2024 202420242024PPT SESIÓN 03.pptx
 
LA LEY DE LAS XII TABLAS en el curso de derecho
LA LEY DE LAS XII TABLAS en el curso de derechoLA LEY DE LAS XII TABLAS en el curso de derecho
LA LEY DE LAS XII TABLAS en el curso de derecho
 
SUNEDU - Superintendencia Nacional de Educación superior Universitaria
SUNEDU - Superintendencia Nacional de Educación superior UniversitariaSUNEDU - Superintendencia Nacional de Educación superior Universitaria
SUNEDU - Superintendencia Nacional de Educación superior Universitaria
 
REPORTE-HEMEROGRÁFICO-MARZO-2024-IRAPUATO-¿CÓMO VAMOS?.pdf
REPORTE-HEMEROGRÁFICO-MARZO-2024-IRAPUATO-¿CÓMO VAMOS?.pdfREPORTE-HEMEROGRÁFICO-MARZO-2024-IRAPUATO-¿CÓMO VAMOS?.pdf
REPORTE-HEMEROGRÁFICO-MARZO-2024-IRAPUATO-¿CÓMO VAMOS?.pdf
 
El Teatro musical (qué es, cuál es su historia y trayectoria...)
El Teatro musical (qué es, cuál es su historia y trayectoria...)El Teatro musical (qué es, cuál es su historia y trayectoria...)
El Teatro musical (qué es, cuál es su historia y trayectoria...)
 
HABILESASAMBLEA Para negocios independientes.pdf
HABILESASAMBLEA Para negocios independientes.pdfHABILESASAMBLEA Para negocios independientes.pdf
HABILESASAMBLEA Para negocios independientes.pdf
 
CUESTIONARIO A ADICCION A REDES SOCIALES.pdf
CUESTIONARIO A ADICCION A REDES SOCIALES.pdfCUESTIONARIO A ADICCION A REDES SOCIALES.pdf
CUESTIONARIO A ADICCION A REDES SOCIALES.pdf
 
CAPACITACION_higiene_industrial (1).ppt...
CAPACITACION_higiene_industrial (1).ppt...CAPACITACION_higiene_industrial (1).ppt...
CAPACITACION_higiene_industrial (1).ppt...
 
La importancia de las pruebas de producto para tu empresa
La importancia de las pruebas de producto para tu empresaLa importancia de las pruebas de producto para tu empresa
La importancia de las pruebas de producto para tu empresa
 
REPORTE DE INCIDENCIA DELICTIVA MARZO 2024.pdf
REPORTE DE INCIDENCIA DELICTIVA MARZO 2024.pdfREPORTE DE INCIDENCIA DELICTIVA MARZO 2024.pdf
REPORTE DE INCIDENCIA DELICTIVA MARZO 2024.pdf
 
Data Warehouse.gestion de bases de datos
Data Warehouse.gestion de bases de datosData Warehouse.gestion de bases de datos
Data Warehouse.gestion de bases de datos
 
PREGRADO-PRESENCIAL-FASE-C-202401 (1).pdf
PREGRADO-PRESENCIAL-FASE-C-202401 (1).pdfPREGRADO-PRESENCIAL-FASE-C-202401 (1).pdf
PREGRADO-PRESENCIAL-FASE-C-202401 (1).pdf
 
tipos de organización y sus objetivos y aplicación
tipos de organización y sus objetivos y aplicacióntipos de organización y sus objetivos y aplicación
tipos de organización y sus objetivos y aplicación
 
bases-cye-2024(2) una sola descarga en base de feria de
bases-cye-2024(2) una sola descarga en base de feria debases-cye-2024(2) una sola descarga en base de feria de
bases-cye-2024(2) una sola descarga en base de feria de
 
17 PRACTICAS - MODALIDAAD FAMILIAAR.docx
17 PRACTICAS - MODALIDAAD FAMILIAAR.docx17 PRACTICAS - MODALIDAAD FAMILIAAR.docx
17 PRACTICAS - MODALIDAAD FAMILIAAR.docx
 

12. Arboles.ppt

  • 2. INTRODUCCION  Las listas enlazadas son estructuras lineales  Son flexibles pero son secuenciales, un elemento detrás 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 detrás de otro  Son muy útiles para la búsqueda y recuperación de información
  • 3. CONCEPTO  Estructura que organiza sus elementos formando jerarquías: PADRES E HIJOS  Un subárbol de un árbol  Es cualquier nodo del árbol junto con todos sus descendientes  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 C F  Todos los nodos tienen al menos un padre, menos la raíz: A  Si no tienen hijos se llaman hoja: D, E, F y C B D E F A es Padre B y C hijos de A: hermanos B es Padre D, E, F hijos de B
  • 4. 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  Nivel(profundidad) de un nodo: es el numero de nodos entre el nodo y la raíz.  Nivel de un árbol  Es el numero de nodos entre la raíz y el nodo mas profundo del árbol, la altura del un árbol entonces  Grado(aridad) de un nodo: es numero de hijos del nodo  Grado(aridad) de un árbol: máxima aridad de sus nodos
  • 5. TDA ARBOL : DEFINICION INFORMAL  Valores:  Conjunto de elementos, donde SOLO se conoce el nodo raíz  Un nodo puede almacenar contenido y estar enlazado con  Sus árboles hijos (pueden ser dos o varios)  Operaciones: Dependen del tipo de árbol, pero en general tenemos  Vaciar o inicializar el Arbol  void Arbol_Vaciar (Arbol *A);  Eliminar un árbol  void Arbol_Eliminar(Arbol *A);  Saber si un árbol esta vacío  bool Arbol_EstaVacio(ArbolA);  Recorrer un árbol  void PreOrden(Arbol A)  void EnOrden(Arbol A)  void PostOrden(Arbol A)
  • 6. TDA ARBOL: DEFINICION FORMAL <arbol> ::= <<NULL>> | <nodo> <nodo> ::= <contenido>{<arbol>} <contenido> ::= <<dato>>{<<dato>>}
  • 7. ARBOLES BINARIOS  Tipo especial de árbol  Cada nodo no puede tener mas de dos hijos  Un árbol puede ser un conjunto  Vacío, no tiene ningún nodo  O constar de tres partes:  Un nodo raíz y  Dos subárboles binarios: izquierdo y derecho  La definición de un árbol binario es recursiva  La definición global depende de si misma A B C D A B C D E H I F G J RAIZ Sub. Izq. Sub. Der.
  • 8. DEFINICIONES RECURSIVAS  La definición del árbol es recursiva  Se basa en si misma  La terminología de los árboles  También puede ser definida en forma recursiva  Ejemplo: NIVEL de un árbol  Identificar el caso recursivo y el caso mas básico A nivel 1 Caso Básico Un árbol con un solo nodo tiene nivel 1 Caso Recursivo Si tiene mas de un nodo, el nivel es: 1 + MAX(Nivel(SubIzq), Nivel(SubDer)) S. izq. Nivel 1 S. der. Nivel 1 A B C Nivel Del Arbol: 2 SUB. IZQ. Nivel = 1 + Max(0,Sub.Izq) SUB. DER. Nivel 1 SUB. IZQ. Nivel = 1 + Max(0,Sub.Izq.) SUB. DER.. Nivel = 1 SUB. IZQ. Nivel = 1 + Max(0,1) A B C D E SUB. IZQ. Nivel = 1 + Max(0,2) NIVEL : 1 + MAX(S.IZQ, S.DER) NIVEL : 1 + MAX(3, 1) NIVEL : 4 SUB. IZQ. Nivel = 3
  • 9. ARBOLES BINARIOS LLENOS  Un árbol de altura h, esta lleno si  Todas sus hojas esta en el nivel h  Los nodos de altura menor a h tienen siempre 2 hijos  Recursiva  Si T esta vacío,  Entonces T es un árbol binario lleno de altura 0  Si no esta vacío, y tiene h>0  Esta lleno si los subárboles de la raíz, son ambos árboles binarios llenos de altura h-1
  • 10. ARBOLES BINARIOS COMPLETOS  Un arbol de altura h esta completo si  Todos los nodos hasta el nivel h-2 tienen dos hijos cada uno y  En el nivel h-1, si un nodo tiene un hijo derecho, todas las hojas de su subarbol izquierdo están a nivel h  Si un arbol esta lleno, tambien esta completo
  • 11. OTROS  Un árbol equilibrado es cuando  La diferencia de altura entre los subárboles de cualquier nodo es máximo 1  Un árbol binario equilibrado totalmente  Los subárboles izquierdo y derecho de cada nodo tienen las misma altura: es un árbol lleno  Un árbol completo es equilibrado  Un árbol lleno es totalmente equilibrado
  • 12. RECORRIDOS DE UN A.B.  Recorrer es  Visitar todos los elementos de una estructura  Como recorrer un árbol  Hay tantos caminos, cual escoger?  Existe tres recorridos típicos  Nombrados de acuerdo a la posición de la raíz  Preorden: raíz - subarbol izq. - subarbol der.  Enorden : subarbol izq. - raíz - subarbol der.  Postorden : subarbol izq. - subarbol der. -raíz
  • 13. EJEMPLO PREORDEN G G-D G-D-B G-D-B-A G-D-B-A-C G-D-B-A-C-E G D K B E H M A C F J I L G 1 D 2 B 3 A 4 C 5 E 6 F 7 G-D-B-A-C-E-F K 8 G-D-B-A-C-E-F-K H 9 G-D-B-A-C-E-F-K-H J 10 G-D-B-A-C-E-F-K-H-J I 11 G-D-B-A-C-E-F-K-H-J-I M 12 G-D-B-A-C-E-F-K-H-J-I-M L 13 G-D-B-A-C-E-F-K-H-J-I-M-L 1. Visitar raiz 2. Preorden al Subarbol Izq. 3. Preorden al Subarbol Der.
  • 14. AB y NODOAB: DEFINICION FORMAL <ab>::= nulo | <nodo> <nodoab>::=<contenido>+<izq>+<der> <izq>::=<ab> <der>::=<ab> <contenido>::<<dato>>|{<<dato>>}
  • 15. AB Y NODOAB: DECLARACION  Un árbol binario: conjunto de nodos  Solo se necesita conocer el nodo raíz  Cada nodo  Tiene Contenido y  Dos enlaces: árbol hijo izquierdo, árbol hijo derecho  Un nodo hoja, es aquel cuyos dos enlaces apunta a null  Un nodo en un árbol tiene mas punteros a null que un nodo de una lista  De un árbol solo se necesita conocer su raíz  La raíz, que es un nodo, puede definir al árbol o typedef struct NodoAB{ Generico G; NodoAB *izq, *der; }NodoAB; typedef struct NodoAB *AB;
  • 16. NODOAB: OPERACIONES  Elemento de un árbol que  Almacena información (contenido),  Conoce hijo izq. y derecho, ambos son nodos  Operaciones Básicas  Crear un nuevo nodo hoja y eliminar hoja existente  NodoAB *NodoAB_CrearHoja(Generico G);  void NodoAB_Eliminar (NodoArbol **A);  Saber si el nodo es o no hoja  bool NodoAB_EsHoja(NodoArbol *p);
  • 17. NODOAB: MAS OPERACIONES  Consultas de los campos de un nodo  Generico NodoAB_ConsultaContenido(NodoAB *nodo);  NodoAB *NodoAB_Izq (NodoAB *nodo);  NodoAB *NodoAB_Der(NodoAB *nodo);  Cambiar los campos de un nodo  void NodoAB_SetContenido (NodoAB *nodo , Generico G);  void NodoAB_SetIzq(NodoAB *nodo, NodoAB *enlace);  void NodoAB_SetDer(NodoAB *nodo, NodoAB *enlace);
  • 18. AB: CREAR NODO HOJA  Se debe crear un nodo nuevito: un nodo hoja NodoAB *NuevaHoja(Generico G){ NodoAB *nuevo; nuevo = (NodoAB *)malloc(sizeof(NodoAB)); nuevo->G = G; nuevo->izq = NULL; nuevo->der= NULL; return nuevo; }
  • 19. AB: OPERACIONES  Crear y Eliminar  AB_Vaciar(AB *A);  AB_Eliminar(AB *A);  Estado del Arbol  bool AB_EstaVacio(AB A);  Añadir 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 contenido  NodoArbol *AB_Buscar(AB A, Generico G, Generico_fnComparar fn );  Recorridos  void AB_PreOrden(AB A);  void AB_PosOrden(ABl A);  void AB_EnOrden(AB A);
  • 20. AB: INSTANCIANDO Y CREANDO  Un Arbol Vacío, es aquel cuyo nodo raíz apunta a NULL void AB_Vaciar(AB *A){ *A = NULL; }  Para crear una variable tipo Arbol, y empezarla a usar:  Instanciarlo (crear variable)  Vaciar el árbol  Para añadirle una hoja al árbol, crear hoja: AB A; AB_Vaciar(&A); A = NodoAB_CrearHoja(Generico_CrearEntero(1)); 1 A
  • 21. 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  En todo algoritmo recursivo debemos buscar dos casos  Básico, para terminar la recursividad  Recursivo, donde la función se llama a si misma Caso Básico  Si AB_EstaVacio(raiz)  Terminar de recorrer Caso Recursivo  Si !AB_EstaVacio(raiz)  AB_EnOrden(raiz->izq);  Mostrar raiz->I  AB_EnOrden(raiz->der);
  • 22. 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 B C D E F G Arbol Vacio!, Terminar D 1 Arbol Vacio!, Terminar B 2 Arbol Vacio!, Terminar E 3 Arbol Vacio!, Terminar A 4 F 5 Arbol Vacio!, Terminar C 6 Arbol Vacio!, Terminar G 7 Arbol Vacio!, Terminar Arbol Vacio!, Terminar
  • 23. APLICACIÓN: EVALUACION DE EXPRESIONES  Ya sabemos lo de las expresiones, cierto?  InFija, operador en medio  PreFija, operador antes de dos operandos  PosFija, operador luego de dos operandos  Para evaluar una expresion dada, podriamos  Pasarla a posfija y usar solo pilas  Pasarla a posfija y usar pilas y un arbol de expresion
  • 24. 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 (a+b)*c + a b c *
  • 25. EJERCICIO EN CLASE  Construya arboles de expresion para:  [X+(Y*Z)] * (A-B)  Deducir las expresiones de los siguientes A.B. + a * b - + c d
  • 26. EVALUAR UNA EXPRESION ARTIMETICA EN INFIJA  La expresion se transforma a la expresion posfija  Esto, ya sabemos como hacer  Crear un arbol de expresion  Para esto se va a usar una pila y un arbol de caracteres  Usando el arbol, evaluar la expresion
  • 27. CREAR UN ARBOL DE EXPRESION  Los operandos seran siempre nodos hoja del arbol  Al revisar un operando, creo una nueva hoja y la recuerdo  Los operadores seran nodos padre  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+ A B * B A C D * D C - * D C * B A H + - * D C * B A H
  • 28. EVALUACION DE LA EXP. POSTFIJA  Lo ideal es recuperar los dos operandos, el operador, y ejecutar la opcion  Que recorrido es el ideal?  PostOrden + - * D C * B A H Para evaluar el arbol: Si el arbol tiene un solo nodo y este almacena un operando El resultado de la evaluacion es el valor de ese operando Si no 1. Res1 = Evaluo subarbol izquierdo 2. Res2 = Evaluo subarbol derecho 3. Recupero la info de la raiz y efectuo la operación alli indicada, entre Res1 y Res2 A A y B A * 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
  • 29. ARBOL BINARIO DE BUSQUEDA  Los elementos en un arbol  Hasta ahora no han guardado un orden  No sirven para buscar elementos  Los arboles de busqueda  Permiten ejecutar en ellos busqueda binaria  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 4 5 9 6 <> 30 41 75 55 4 85 <>
  • 30. TDA ABB: DEFINICION  Valores:  Conjunto de elementos  Dado un nodo p,  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 <abb>::= NULL | <abb_nodo> <abb_nodo>::=<clave>+<contenido>+<izq>+<der> <izq>::=<abb> <der>::=<abb> <clave>::<<dato>>|{<<dato>>} <contenido>::<<dato>>|{<<dato>>} typedef struct ABB_Nodo{ Generico clave, G; ABB_Nodo *izq, *der; }ABB_Nodo;
  • 31. CREAR CON CLAVE  Como el nodo ahora tiene un campo clave  Cambian un poco las operaciones del 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; }
  • 32. 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 20 10 5 4
  • 33. EJERCICIO EN CLASE  Construya el arbol para almacenar:  12, 8, 7, 16, 11
  • 34. 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  Si clave buscada es igual a la clave del nodo evaluado  BINGO, LO ENCONTRE  Si no  Si la clave buscada es mayor a la del nodo evaluado  Buscar en el subarbol derecho  Si no  Buscar en el subarbol izquierdo 8 3 1 20 10 5 4 Buscar(raiz,5) 5 5 Buscar(raiz,25) No existe
  • 35. 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); }
  • 36. INSERCION DE UN NODO  Muy parecido a la busqueda  Debo insertar en la posicion correcta  El arbol debe mantener sus propiedades  Pasos:  Crear una nueva hoja  Buscar en el arbol donde ponerla  Enlazar el nuevo nodo al arbol 8 3 1 20 10 5 4 Insertar(raiz,15) 15>8…der 15<20…izq 15>10 …der Insertar aqui 15
  • 37. 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; }
  • 38. 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  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 34 18 6 90 28 25 20 100 Eliminar(raiz,34) 34 nmayor 28 28
  • 39. SACAR NODO: CODIGO NodoABB *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; else tmp = ABB_SacarRaiz(A); return tmp; }