Está en la página 1de 42

Árboles Binarios

Estructuras de Datos

Msc.Alberto Marroquin Gomez


¿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
• Qué es un árbol?

Un árbol es una estructura de datos no lineal puesto que


cada elemento apunta a uno o varios elementos del
mismo tipo; esto es dado un elemento, no hay un único
camino a seguir. El elemento que apunta a otro es
llamado padre, mientras que el elemento apuntado se
conoce como hijo. Todos los elementos tienen un padre
a excepción de la raíz. Puede decirse que un árbol esta
formado por subárboles resaltando así su
naturaleza recursiva.

¿Qué es un árbol binario?

Un ÁRBOL BINARIO es aquel es el que cada elemento


apunta como máximo a otros 2 elementos, comúnmente
llamados hijo izquierdo y hijo derecho.
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.


Tipos de arboles binarios
Tipos de arboles binarios
Tipos de arboles binarios
Árboles Binarios de busqueda

Estructuras de Datos

Msc.Alberto Marroquin Gomez


¿Qué es un árbol binario de búsqueda?

Un árbol binario de búsqueda o ABB, es un árbol


binario en el cual para todo elementos mayores a
él, se ubican en su rama derecha, mientras que los
elementos menores van en su rama izquierda. Cada
elemento se almacena una sola vez por lo que no
existen elementos repetidos.
Á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
• Ya con estas definiciones claras sobre arboles;
• ahora estos son conceptos generales de lo que es un
árbol, para poder implementarlos en lenguaje C++
tenemos que tener conocimientos previos sobre
listas enlazadas y su implementación.

Cada elemento(nodo) de un árbol ABB cuenta con
tres campos:

- Dato(numero, letra, palabra, etc), en este caso


usaremos un numero(entero).
- Puntero al nodo derecho
- Puntero al nodo izquierdo
"Los punteros son variables que guardaran en la memoria la dirección
de otra variable" en este caso la de una estructura llamado nodo.

Recorridos de una árbol

Es la manera recursiva como pasaremos por cada nodo del árbol,


existes tres formas:

Enorden: Si visitamos primero hijo izquierdo, luego el padre y


finalmente el hijo derecho

Preorden: Primero el padre, luego el hijo izquierdo y finalmente el hijo


derecho.

Postorden: Primero hijo izquierdo, luego el hijo derecho y finalmente


el padre

Existe muchos mas conceptos sobre arboles ABB por ejemplo,


recorridos por nivel, profundidad de una árbol, etc; por ahora solo
dejare esos conceptos. Ahora pasaremos a la implementación en
lenguaje C++ como le había comentado al inicio del post.
Implementación de un ABB…

class NodoArbol
{
public:
int info;
NodoArbol *izq, *der;
NodoArbol( );
NodoArbol(int dato);
};
NodoArbol(void) { izq = der = NULL; }
NodoArbol(int dato) { info = dato; izq = der = NULL; }
Continuación…

Primero creamos el nodo:


struct nodo{
int dato;
struct nodo *der;
struct nodo *izq;
};
Operaciones de un árbol binario de búsqueda

• Insertar un nodo en el árbol


• Mostrar el árbol completo
• Buscar un nodo especifico
• Recorrer el árbol
• Borrar un nodo del arbol
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
else que tiene el valor buscado

p=(p->info > valor? p->izq: p->der);


}
Equivalente a:
return NULL; No se encontró el valor por lo que
se regresa un NULL
if ( p -> info > valor )

… 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....
bool ABB::Insertar(int valor)
{
NodoArbol *nuevo, *actual, *anterior;
nuevo = new NodoArbol(valor);
actual = raiz;
anterior = NULL;
while ( actual != NULL )
{ Busca el Nodo Padre.
if ( valor == actual -> info ) return 0; Al final, Anterior será el
padre del nuevo nodo.
anterior = actual;
actual = (actual->info > valor ? actual->izq : actual->der);
}
if(anterior==NULL)
raiz=nuevo; Agrega el nodo como
else { nodo hoja.
if ( anterior -> info > valor ) Si Anterior es igual a
anterior -> izq = nuevo; NULL quiere decir que
else el árbol está vacío por
lo que el nodo a agregar
anterior -> der = nuevo; será la raíz.
}
return 1;
}
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).
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

También podría gustarte