Está en la página 1de 27

• Definiciones

• Árboles binarios

Árboles • Ordenados
• AVL
• Roji-negros
• Árboles n-arios
• B
• B+
Definición
• Son estructuras definidas para almacenar, y especialmente para buscar
la información de manera ágil y efectiva.

• Un árbol es una estructura de datos jerárquica compuesta por un


conjunto de elementos denominados nodos, uno de los cuales se
distingue denominándose raíz.

• conjunto de vértices o nodos y aristas, donde los nodos son quienes


contienen la información y las aristas constituyen uniones entre nodos
Conceptos fundamentales (1)

• Nodo • Camino
• Arista • Longitud de camino
• Nodo raíz • Nivel
• Nodo hoja o terminal • Nodo antecesor o ancestro
• Nodo interior • Nodo descendiente o sucesor
• Árbol nulo • Nodo padre
Conceptos fundamentales (2)
h
𝐿𝐶𝐼=∑ 𝑛𝑖 ∗ 𝑖
𝑖=0

• Nodo hijo • Longtud de camino interno h′


𝐿𝐶𝐸=∑ 𝑛𝑒𝑖 ∗𝑖
• Grado de un nodo • Longitud de camino externo 𝑖=0

• Grado del árbol • Árbol extendido


• Altura de un nodo • Nodo especial
• Altura del árbol • Operaciones sobre árboles:
• Profundidad de un nodo Inserción, eliminación, búsqueda
y recorridos
Ejemplo
Animales

Vertebrados Invertebrados

Mamíferos Peces Anfibios Reptiles Aves Insectos Moluscos

León Vaca Caimán Tortuga Mosca Pulpo Caracol

1 2
Árboles binarios
• Es un tipo especial de árbol en el cual cada uno de sus nodos tiene
máximo dos hijos.
Árbol binario ordenado

• Es un tipo de árbol binario que se caracteriza además, por que para


cada uno de sus nodos se cumple que los subárboles descendientes
con claves menores se encuentran a la izquierda y los de claves
mayores a la derecha ya sea que se usen claves alfabéticas o
numéricas.

struct nodo{int clave; nodo *izq,*der;};


Clase Árbol binario ordenado
class arbolbinord {nodo *raiz;
cola *listInorden, *listPreorden,*listPosorden;
public: arbolbinord(){raiz=NULL;
listInorden=new cola;
listPreorden= new cola;
listPosorden= new cola;}
void insertar(int dato);
nodo *buscarpadre(int dato, nodo *p);
void eliminar(int dato);
nodo * buscar_nodo (int dato, nodo **padre);
void inorden(nodo* inicio);
void preorden(nodo *inicio);
void posorden(nodo *inicio);
};
Inserción
• En un árbol binario ordenado, el primer elemento se insertará en la raíz
y posteriormente se irá examinando cada nodo del árbol (empezando
siempre por la raíz), para ver si la clave a insertar es mayor o menor que
la que contiene el nodo evaluado, cuando no haya nodo a evaluar, en
ese lugar se ubicará el nodo con la nueva clave.

• Como ejemplo, supóngase que se desean insertar, en un árbol binario


ordenado, inicialmente vacío, una a una las siguientes claves en el orden
dado, se mostrará gráficamente el árbol resultante: 100-150-50-30-75-
125-170-10-60-90-180-140-160-70-200-300-240-270
Ejemplo de Inserción Izq - raíz – der : inorden
Raiz – izq – der : preorden
Izq – der- Raiz: posorden
Recorridos (1)

• Inorden: Este primer recorrido utiliza el procedimiento recursivo:


subárbol izquierdo – raíz – subárbol derecho, el cual será aplicado a
todos los nodos del árbol empezando por la raíz.
• En el árbol del ejercicio anterior, el recorrido en inorden es: 10-30-
50-60-75-90-100-125-140-150-160-170-180.
• Para la implementación, desde el punto de vista computacional, es
posible eliminar la recursividad utilizando pilas o colas
Recorridos (2)

• Preorden: También conocido como recorrido en orden previo, el


procedimiento recursivo que aquí se utiliza es: raíz – subárbol
izquierdo – subárbol derecho, el cual se aplica a todos los nodos del
árbol iniciando en la raíz..
• En el árbol obtenido como ejercicio inicial, el recorrido en preorden
es: 100-50-30-10-75-60-90-150-125-140-170-160-180
Recorridos (3)

• Posorden: En este recorrido el procedimiento recursivo utilizado es:


subárbol izquierdo – subárbol derecho – raíz, y al igual que en los dos
recorridos anteriores se aplica a todos los nodos del árbol iniciando
en la raíz.
• Para el árbol del ejercicio, el recorrido en posorden es: 10-30-60-90-
75-50-140-125-160-180-170-150-100
Borrado
• Cada vez se elimina un nodo, el árbol debe conservar las características
que se definieron para un árbol binario ordenado.
• Borrado de un nodo hoja: Si el nodo borrado no tiene hijos, simplemente
se desconecta del nodo padre (es decir, se reemplaza por una dirección
nula) y se libera la memoria que ocupa el nodo a borrar.
• Borrado de un nodo interno: Si el nodo borrado tiene hijos (sub-àrboles),
puede tener uno o dos. En caso de que solamente tenga un hijo, este hijo
reemplazará al nodo borrado y será enlazado con el padre del nodo
borrado. Si el nodo borrado tiene dos sub-arboles, deberá definirse una
política para seleccionar el nodo que lo reemplazará.
Se desconecta el padre del hijo y se
Sin hijos libera la memoria del hijo borrado

Borrado El hijo reemplaza al padre borrado, es decir,


de un 1 hijo se conecta al abuelo con el nieto y se libera
la memoria del padre borrado
nodo

con hijos
El descendiente de la derecha más a la
izquierda reemplaza al ancestro borrado,
es decir, se copia a clave del descendiente
2 hijos en el lugar del ancestro y se borra el nodo
descendiente convirtiendo el problema
en borrado de un nodo sin hijos o con un
solo hijo
Ejercicio
• Del árbol resultante en el ejercicio anterior, borrar: 10, 60 , 180, 75,
125, 170, 50 y 100

• Dibujar el árbol resultante


Representación de los árboles binarios en
arreglos class arbinordArreglo {nodo *arbol;
cola *listInorden, *listPreorden,*listPosorden;
public: arbinordArreglo (int tam);
void insertar(int dato);
struct nodo{int clave; int buscarpadre(int dato, int posBus);
int izq, der;}; void eliminar(int dato);
int buscar_nodo(int dato, int *p);
int getraiz(){return arbol[0].izq;}
void inorden(int inicio);
void preorden(int inicio);
void posorden(int inicio);
bool Borrarnodo(int dato);
~arbinordArreglo(){delete arbol;}
Representación de los árboles binarios en
arreglos
Inserción
• Para ilustrar el proceso gráficamente, se insertarán las mismas claves
empleadas en el TDA inicial: 100-150-50-30-75-125-170-10-60-90-
180-140-160

0 1 2 3 4 5 6

7 8 9 10 11 12 13
Ejemplo de Inserción
Se desconecta el padre del hijo y se
Sin hijos libera (se agrega a la lista de pos
libres) la memoria del hijo borrado

Borrado El hijo reemplaza al padre borrado, es decir,


de un 1 hijo se conecta al abuelo con el nieto y se libera
la memoria del padre borrado
nodo
El descendiente de la derecha más a la
izquierda reemplaza al ancestro borrado,
con hijos es decir,
1 se desconecta el padre de reemplazo
del hijo de reemplazo (si tiene hijo se
conecta con el abuelo con el nieto)
2 hijos 2.se copian los hijos del ancestro en el
lugar del descendiente
3 se libera en ancestro
4 se conecta el padre original con el nodo
de reemplazo
Borrado
• Ejemplo de borrado de la clave 10 (hoja)

0 1 2 3 4 5 6
12
 
1 8 100 3 2 150 6 7 50 4 5 30 8 0 75 9 10 0 12
5

7 8 9 10 11 12 13

170 13 11  10 0 0 60 0 0 90 0 0 180 0 0 140 0 0 160 0 0


Borrado
• Ejemplo de borrado de la clave 125 (1 hijo)

0 1 2 3 4 5 6
  1 8 100 3 2 150 12 7 50 4 5 30 0 0 75 9 10  125 0 12

7 8 9 10 11 12 13
170 13 11   0 60 0 0 90 0 0 180 0 0 140 0 0 160 0 0
Borrado
• Ejemplo de borrado de la clave 50 (2 hijos)

0 1 2 3 4 5 6
  1 6 100 3 2 150 12 7 50 4 5 30 0 0 75 9 10   0 8

7 8 9 10 11 12 13
170 13 11   0 60 0 0 90 0 0 180 0 0 140 0 0 160 0 0
Ejercicio
• En un árbol binario ordenado representado como arreglo de 8
elementos, realice las siguientes operaciones en ese orden:

1. Insertar: 100 90 80 110 95 120


2. Eliminar: 95 90
3. Insertar 30 140 108
4. Eliminar 120 30
5. Insertar 128 97 85
6. Eliminar 110 100

También podría gustarte