Anda di halaman 1dari 38

ÁRBOLES

BINARIOS

E S T R U C T U R A S D E D AT O S
Las estructuras dinámicas son las en la ejecución varia el
número de elementos y uso de memoria a lo largo del
programa)

Entre estas tenemos:

Lineales (listas enlazadas, pilas y colas)


No lineales (arboles binarios y grafos o redes)
¿QUÉ ES UN ÁRBOL?
• Es una estructura de datos jerárquica.
• La relación entre los elementos es de uno a
muchos.
TERMINOLOGÍA
• Nodo: Cada elemento en un árbol.
• Nodo Raíz: Primer elemento agregado al árbol.

Nodo Raíz
A

B C

D E F G

K
H
MÁS TERMINOLOGÍA
• Nodo Padre: Se le llama así al nodo predecesor de un elemento.
• Nodo Hijo: Es el nodo sucesor de un elemento.
• Hermanos: Nodos que tienen el mismo nodo padre.

A
Nodo Padre
B C

F y G son Nodos Hijos de C


D E F G
F y G son hermanos
K
H
MÁS TERMINOLOGÍA
• Nodo Hoja: Aquel nodo que no tiene hijos.

B C

D E F G
D, H, F y K son Nodos Hojas
K
H
MÁS TERMINOLOGÍA
• Subárbol:Todos los nodos descendientes por la izquierda
o derecha de un nodo.

B C

D E F G
Subárbol derecho de C
K
H

Subárbol izquierdo de C
ALTURA Y NIVELES

A
Altura Nivel 0
del árbol C
B
=4 Nivel 1
D E F G
Nivel 2
K
H
Nivel 3

La Altura es la cantidad de niveles.


ÁRBOL BINARIO DE
BÚSQUEDA (ABB)

• Este tipo de árbol permite almacenar información ordenada.


• Reglas a cumplir:
– Cada nodo del árbol puede tener 0, 1 ó 2 hijos.
– Los descendientes izquierdos deben tener un valor menor al padre.
– Los descendientes derechos deben tener un valor mayor al padre.
EJEMPLOS DE ABB…

21 30

33 33
13 21

5 25 36 41
18 32

40 43
15
¿POR QUÉ NO SON ABB?

21 5

33 6
13 1

17 18 22 4
25 2

15 40
IMPLEMENTACIÓN DE UN
ABB…
IMPLEMENTACIÓN DE UN
ABB…
PROCESO PARA BUSCAR UN NODO...

Buscar el 25
Paso ¿El 25 es mayor o
menor que el 21?
Paso
21
1 2 21
¿El 25 es
13 33 33 mayor o menor
13 que el 33?

10 40 40
18 25 10 18 25

Paso
3 21

13 33

10 18 40
25
Encontrado
IMPLEMENTACIÓN DE LA BÚSQUEDA

...
p=raiz;
while (p != NULL)
{ if (p->info == valor)
return p; P contiene la dirección del nodo
que tiene el valor buscado
else
p=(p->info > valor? p->izq: p->der);
} Equivalente a:
return NULL; No se encontró el valor por lo que
if ( p -> info > valor )
se regresa un NULL
… p = p -> izq;
else p = p-> der;
PROCESO PARA AGREGAR
NODOS...
• Reglas:
– El valor a insertar no existe en el árbol.
– El nuevo nodo será un Nodo Hoja del árbol.
• Procedimiento
1. Buscar el Nodo Padre del nodo a agregar.
2. Agregar el nodo hoja.
EJEMPLO
Agregar el valor 26

Paso ¿El 26 es mayor o


menor que el 21?
Paso
21
1 2 21
¿El 26 es
13 33 33 mayor o menor
13 que el 33?

10 40 40
18 25 10 18 25

Paso Paso
3 21 4 21

33 13 33
13

18 40 10 18 40
10 25 25
Se encontró el Nodo
Padre Agregar el nodo
26
COMENTARIOS
IMPORTANTES....
• El orden de inserción de los datos, determina la forma del ABB.
• ¿Qué pasará si se insertan los datos en forma ordenada?
• La forma del ABB determina la eficiencia del proceso de búsqueda.
• Entre menos altura tenga el ABB, más balanceado estará, y más
eficiente será. 10

13

Este árbol está 18


desbalanceado
porque los valores se
agregaron en el siguiente 21
orden:
10, 13, 18, 21, 25, 33, 40
25
Implementación en la clase
árbol binario....
RECORRIDOS DE ARBOLES
BINARIOS
• El recorrido de árboles se refiere al proceso de visitar de una manera
sistemática, exactamente una vez, cada nodo en una estructura de
datos de árbol (examinando y/o actualizando los datos en los nodos).

• Tales recorridos están clasificados por el orden en el cual son


visitados los nodos.
RECORRIDO EN
PROFUNDIDAD-PRIMERO

•Preorden: (raíz, izquierdo, derecho). Para


recorrer un árbol binario no vacío en preorden, hay
que realizar las siguientes operaciones
recursivamente en cada nodo, comenzando con el
nodo de raíz:
1. Visite la raíz
2. Atraviese el sub-árbol izquierdo
3. Atraviese el sub-árbol derecho
RECORRIDO EN
PROFUNDIDAD-PRIMERO

•Postorden: (izquierdo, derecho, raíz). Para recorrer


un árbol binario no vacío en postorden, hay que
realizar las siguientes operaciones recursivamente en
cada nodo:
1. Atraviese el sub-árbol izquierdo
2. Atraviese el sub-árbol derecho
3. Visite la raíz
RECORRIDO EN
PROFUNDIDAD-PRIMERO

•Inorden: (izquierdo, raíz, derecho). Para recorrer un


árbol binario no vacío en inorden (simétrico), hay que
realizar las siguientes operaciones recursivamente en
cada nodo:
1. Atraviese el sub-árbol izquierdo
2. Visite la raíz
3. Atraviese el sub-árbol derecho
Implementación recorridos
Implementación otras opciones
Implementación otras opciones
Implementación otras opciones
Implementación otras opciones
PROCESO PARA ELIMINAR
UN NODO
• Si el nodo a eliminar es un:
– Nodo hoja
• Buscar el Nodo Padre del nodo a borrar.
• Desconectarlo.
• Liberar el nodo.
– Nodo con un hijo
• Buscar el Nodo Padre del nodo a borrar.
• Conectar el hijo con el padre del nodo a borrar.
• Liberar el nodo.
– Nodo con dos hijos
• Localizar el nodo predecesor o sucesor del nodo a borrar.
• Copiar la información.
• Eliminar el predecesor o sucesor según sea el caso.
CASO: ELIMINAR NODO HOJA
Eliminar el valor 25

Paso 21
1
Nodo Padre
33 localizado
13

Paso
10 18 25 40 21
2

13 33

10 18 40
25
Desconectarlo y
liberar el nodo
CASO: ELIMINAR NODO CON UN HIJO
Eliminar el valor 25

Paso 21
1
Nodo Padre
33 localizado
13

Paso
10 18 25 40 21
2

29 13 33
25
27 30 40
10 18
29
Conectar el Nodo
Padre con el Nodo
27 30 Hijo y liberar el
nodo.
CASO: ELIMINAR NODO CON DOS HIJOS
1. Localizar el nodo predecesor o sucesor del
nodo a borrar.
– El PREDECESOR es “el Mayor de los Menores”.
– El SUCESOR es “el Menor de los Mayores”.
– Para la implementación es igual de eficiente
programar la búsqueda del predecesor que del
sucesor.
2. El valor del Predecedor (o sucesor) se copia al
nodo a borrar.
3. Eliminar el nodo del predecesor (o sucesor
según sea el caso).
Implementación....
PREDECESOR
Uno a la IZQUIERDA y todo a la DERECHA

21

33
El predecesor de: Es:
13
33 30

10 25 40 21 13

29 29 27

27 30
SUCESOR
Uno a la DERECHA y todo a la IZQUIERDA

21
El sucesor de: Es:
33 21 25
13

33 40
10 18 25 40

29 30
29

27 30
IMPLEMENTACIÓN DEL....
PREDECESOR actual apunta al nodo a borrar
P = actual -> izq;
while( p -> der != NULL)
p=p->der;
return p;
SUCESOR
P = actual -> der;
While (p -> izq != NULL )
p=p->izq;
return p;
CASO: ELIMINAR NODO CON DOS
HIJOS
Eliminar el valor 21
utilizando el predecesor
Paso Localizar el valor a Paso 21
21 borrar 2
1
13 33
13 33

10 40
40 18 25
10 18 25
Localizar el Predecesor

Copiar el valor del Paso


Paso Predecesor al nodo que 4 18
3 18 contenía el valor a borrar

13 33

13 33

10 25 40
18
10 18 40
25 Desconectar y liberar el
nodo del Predecesor
CASO: ELIMINAR NODO CON DOS
HIJOS
Eliminar el valor 21
utilizando el Sucesor
Paso Localizar el valor a Paso 21
21 borrar 2
1
13 33
13 33

10 40
40 18 25
10 18 25
Localizar el Sucesor

Copiar el valor del Paso


Paso Sucesor al nodo que 4 18
3 25 contenía el valor a borrar

13 33

13 33

10 18 25 40
10 18 40 Desconectar y liberar el
25
nodo del Sucesor

Anda mungkin juga menyukai