Contenido:
• Definición de árbol
• Conceptos básicos
• Árboles binarios
• Recorrido de árboles
Árboles
¿Qué es un árbol?
A aristas
nodos
B D
C
E F
G H I
Árboles
Conceptos Básicos
Raiz
A
B C D
E F
G H I
Árboles
Conceptos Básicos
B C D
E F
G H I
Árboles
Conceptos Básicos
B C D
E F
Esto no es un arbol, G H I
porque existe mas
de un camino desde
la raiz para llegar a
algunos nodos
Árboles
Conceptos Básicos
• Hijo: todo nodo puede tener mas de una arista que lo lleva a otro
nodo por debajo de él. Estos nodos que se encuentran por debajo de
un nodo dado se llaman hijos. Ejemplo: E es hijo de C, B es hijo de
A, H es hijo de D
A Padres
B C D
Hijos
E F I
G H
Árboles
Conceptos Básicos
A Subárbol
B C D
Hojas E F
G H I
Árboles
Conceptos Básicos
B C D
E F
G H I
Árboles
Conceptos Básicos
A Nivel 0
B C D Nivel 1
E F
G H Nivel
I 2
Árboles
Árboles Binarios
Hijo Hijo
Izquierdo B E Derecho
C D
F G
Árboles Binarios
Un recorrido de un árbol binario requiere que cada nodo del árbol sea
procesado (visitado) una vez y sólo una en una secuencia predeterminada.
Enfoques generales para la secuencia de recorrido:
12/06/2019
Árboles Binarios
Recorrido en amplitud
RecorridoAmplitud
Algoritmo
Inicio
Insertar la raíz en cola Q;
Ptr = raiz
Mientras Q no vacía:
InitCola()
Extraer nodo n de Q;
AddCola(Ptr)
Insertar en Q los hijos de n; Mientras Not ColaVacia() hacer
ptr=SupCola()
3 Mostrar ptr^.inf
Camino 3 1 6 2 5 7 4 Si ptr^izq <> NULL entonces
AddCola(ptr^.izq)
1 6 Fin_si
Si ptr^der <> NULL entonces
2 5 7 AddCola(ptr^.der)
Fin_si
4 Fin_mientras
Fin.
12/06/2019
Árboles Binarios
Recorrido en profundidad
Dado un árbol binario que consta de un nodo raíz (N), un subárbol izquierdo (I) y un
subárbol derecho (D) se pueden definir tres tipos de secuencia de recorrido en
profundidad.
Recorridos de árboles binarios
1 2 3
2 3 1 3 1 2
12/06/2019
Árboles Binarios
Recorrido en profundidad
Según sea la estrategia a seguir, los recorridos se conocen como enorden (inorder) (orden
simétrico), preorden (preorder) (orden previo), y postorden (postorder) (orden posterior).
Donde:
N = Nodo raíz
I = Subárbol izquierdo
D = Subárbol derecho
12/06/2019
Árboles Binarios
- Recorrido preorden (NID)
Regla:
Se procesa el nodo raíz , subárboles izquierdo y derecho.
A
Camino A, B, D, E, C, F, G
1
B C
2 5
D E F G
3 4 6 7
Recorrido preorden de un árbol binario
12/06/2019
Árboles Binarios
- Recorrido preorden (NID)
PreOrden
Inicio
InitPila()
AddPila( NULL)
Ptr = raiz
Mientras ptr <> NULL hacer
Mostrar ptr^.inf
Si ptr^der <> NULL entonces
AddPila( ptr^.der)
Fin_si
Si ptr^.izq <> NULL entonces
Ptr = ptr^.izq
Sino
Ptr = SupPila()
Fin_si
Fin_mientras
Fin.
12/06/2019
Árboles Binarios
- Recorrido enorden (NID)
Regla:
Se procesa el nodo subárboles izquierdo, raiz y el subarbol derecho.
- Recorrido enorden (IND)
4 Camino D, B, E, A, F, C, G
B C
2 6
D E F G
1 3 5 7
12/06/2019
Árboles Binarios
- Recorrido enorden (IND)
Función Enorden en C
void Enorden(Nodo * p) {
if (p) {
Enorden(p->hijo_izqdo); /* recorrer subárbol izquierdo */
printf (“%d “, p->datos); /* visitar la raíz */
Enorden(p->hijo_dcho); /* recorrer subárbol derecho */
}
}
12/06/2019
- Recorrido enorden (IND)
Árboles Binarios
InOrden
Inicio
InitPila()
AddPila(NULL)
Ptr = raiz
Mientras ptr <> NULL hacer
Mientras ptr <> NULL hacer
AddPila(ptr)
Ptr = ptr^.izq
Fin_mientras
Ptr = SupPila()
Tieneder =false
Mientras Ptr <> NULL y no tieneder hacer
Mostrar ptr ^.inf
Si ptr^.der <> NULL entonces
Ptr = ptr^.der
Tieneder = true
Sino
Ptr = SupPila()
Fin_si
Fin_mientras
Fin_mientras
Fin.
12/06/2019
Árboles Binarios
- Recorrido postorden (IDN)
Regla:
Se procesa el nodo subárboles izquierdo, derecho y la raiz
7 Camino D, E, B, F, G, C, A
B C
3 6
D E F G
1 2 4 5
Función Postorden en C
void Postorden(Nodo * p) {
if (p) {
Postorden(p->hijo_izqdo);
Postorden(p->hijo_dcho);
printf(“%d ”, p->datos);
}
}
12/06/2019
Inicio
Cima = 1
Pila[cima]=NULL
Ptr = raiz
Mientras ptr <> NULL hacer
Mientras ptr <> NULL hacer
AddPila( ptr)
Si ptr^.der <> NULL entonces
AddPila(-ptr^.der)
Fin_si
Ptr = ptr^.izq
Fin_mientras
Ptr = SupPila()
Salir = false
Mientras ptr <> NULL y no salir hacer
Si prt > 0 entonces
Mostrar prt^.inf
Ptr = SuppPila()
Sino
Ptr = -ptr
Salir=true
Fin_si
Fin_mientras
Fin_mientras
Fin.
12/06/2019