Professional Documents
Culture Documents
Luis
(bisabuelo)
B
Micaela Lucas María
(hermana) (abuelo) (hermana)
A A h raíz
B C ÁRBOLES
B E F
D E F
G H C D G H I
A
B E F CONTENIDO
C D G H I
• INTRODUCCIÓN
• ÁRBOLES GENERALES
• ÁRBOLES BINARIOS
• ESTRUCTURA DE UN ÁRBOL BINARIO
A
B
B E F INTRODUCCIÓN
C D G H I
• El árbol es una estructura de datos muy
importante en informática y en ciencias de la
computación. Los árboles son estructuras no
lineales, al contrario que los arreglos y las listas
A enlazadas.
B
• Son muy utilizados en informática para
representar fórmulas algebraicas como un método
C
B E F ÁRBOLES GENERALES
C D G H I
D
E
entre sí a través de ramas.
B C
D E F
4
G H
A
B E F Ejemplo típico
C D G H I
Luis
(bisabuelo)
D
E
Luis Juana
(padre) (hermana)
B E F Ejemplo típico
C D G H I
Presidente
C
Director de Director de Director de
D
mantenimiento software internet
E
Ingeniero de
Analista Programador
software
A
B E F Terminología
C D G H I
C
• Rama o arco: línea dirigida que
D
conecta los nodos.
E
• Nodo Padre: Nodo que tiene nodo(s)
sucesores.
• Nodo Hijo: Nodo que tiene un nodo
B
A
C
antecesor.
D E F
7
G H
A
B E F Terminología
C D G H I
D
E
hoja del camino más largo desde la
raíz más uno.
• Subárbol: Cualquier estructura
A conectada por debajo de la raíz.
B C
D E F
8
G H
A
B E F Terminología
C D G H I
C
(desde la raíz hasta el nodo deseado).
D
E
• Grado del nodo: Número de ramas
asociadas.
B C
D E F
9
G H
A
B E F Terminología
C D G H I
Nivel 0 A raíz
A
B
Nivel 1 B E F
Rama FI
C
D
E
Nivel 2 C D G H I 10
B E F Terminología
C D G H I
B C
D E F
11
G H
A
B E F Representación de un árbol
C D G H I
• En niveles de profundidad: es
utilizado para representar sistemas
A
jerárquicos en modo texto o número
B en situaciones tales como facturación,
gestión de stocks en almacenamiento,
C
D
E
etc.
B C
D E F
12
G H
A
Ejemplo de árbol en nivel de
B E F
profundidad
C D G H I
A
A B
A
C
B
B E F D
C
D
E
E
F
C D G H I
13
G
H
A
B C I
D E F
13
G H
A
B E F Representación de un árbol
C D G H I
C
B E F
D
E
C D G H I
14
B
A
C
Notación en paréntesis: A(B(C,D),E,F(G,H,I))
D E F
14
G H
A
B E F ÁRBOLES BINARIOS
C D G H I
D
E
A
A A A
A
B
B C B C B
C
D E F
A
D A
G H
A B
E
C B
B C
D E F
15
G H
A
B E F ÁRBOLES BINARIOS
C D G H I
A
Hijo izquierdo Hijo derecho
A
B
D
B C
E
B C
D E F
16
G H
A
B E F ÁRBOLES BINARIOS
C D G H I
I1 D1
B C I2 I3 D2
B E F Equilibrio
C D G H I
D
E
• El factor de equilibrio de un nodo en
un árbol binario es la diferencia entre
la altura del subárbol derecho (HD) y
A
la altura del subárbol izquierdo (HI).
B C fe(B) = HD - HI .
D E F
18
G H
A
B E F Equilibrio
C D G H I
A
fe(A)= 4 – 0 = 4
B
C A
A B
fe(A)= 2 – 0 = 2
D
B
C
C E
D
E
A
A fe(A)= 1 – 1 = 0
B C
B C
D E F
A
B C G H fe(A)= 2 – 3 = -1
D E F
19
G H
A
C
Árbol completo
B
(profundidad 4)
A
D E F G
B C
D E F H I J K
20
G H
A
C
B
A D E F G
B C
B E F ÁRBOLES BINARIOS
C D G H I
D A
E
B
D
A
E
B C
D E F
22
G H
A
ESTRUCTURA DE UN ÁRBOL
B E F
BINARIO
C D G H I
C
valor null indica un árbol vacío.
D E F
23
G H
A
ESTRUCTURA DE UN ÁRBOL
B E F
BINARIO
C D G H I
A
• El algoritmo correspondiente a la
estructura de un árbol es el siguiente:
B
D Nodo
E
subarbolIzquierdo <referencia a Nodo>
datos <TipoDato>
subarbolDerecho < referencia a Nodo >
A
B C
Fin Nodo
D E F
24
G H
A
ESTRUCTURA DE UN ÁRBOL
B E F
BINARIO
C D G H I
B C
D E F
G H Estructura
A
B Árbol izqdo A dcho
C
D
E izqdo B dcho izqdo C dcho
B C
izqdo G dcho izqdo H dcho
D E F
25
G H
A
B E F Representación en Java
C D G H I
C
Object.
D E F
26
G H
A
B E F Clase Nodo
C D G H I
package arbolBinario;
public class Nodo {
Object dato;
Nodo izda, dcha;
public Nodo(Object x){
A
B
C dato = x;
D izqda = dcha = null;
E }
public Nodo(){
dato = null;
izqda = dcha = null;
A
B C
}
D E F //métodos
27
G H }
A
D
E
árbol que es una referencia al nodo;
sus ramas izquierda y derecha son, a
su vez, árboles binarios.
A
B C
D E F
28
G H
A
D
E
argumento y la rama derecha es el
árbol que se pasa como tercer
argumento
A
B C
D E F
29
G H
A
D
public Arbol(Object elem){
E raiz = new Nodo(elem);
}
public void nuevoArbol(Arbol ramaI, Object dt, Arbol ramaD){
raiz = new Nodo(dt);
A if(ramaI != null) raiz.izqda = ramaI.raiz;
B C if(ramaD != null) raiz.dcha = ramaD.raiz;
D E
}
F
// operaciones con árboles binarios 30
G H
}
A
B E F Tarea
C D G H I
D E F
32
G H
A
OPERACIONES EN ÁRBOL
B E F
BINARIO
C D G H I
D
E
cada nodo del árbol una vez y sólo
una.
B C
D E F
33
G H
A
B E F ÁRBOLES DE EXPRESIÓN
C D G H I
D
E
prescritas). Un token puede ser un
operando o un operador.
• Un árbol de expresión es un árbol
binario con las siguientes propiedades:
A
B C
D E F
34
G H
A
B E F ÁRBOLES DE EXPRESIÓN
C D G H I
C +
D
E d
*
a * (b + c) + d
a +
b c
A
B C
D E F
Una expresión infija y su árbol de expresión
35
G H
A
B E F ÁRBOLES DE EXPRESIÓN
C D G H I
B E F RECORRIDO DE UN ÁRBOL
C D G H I
B C
D E F
37
G H
A
B E F RECORRIDO DE UN ÁRBOL
C D G H I
D
• Un recorrido de un árbol binario requiere
E que cada nodo del árbol sea procesado
(visitado) una vez y sólo una en una
secuencia predeterminada. Existen dos
enfoques generales para la secuencia de
B
A
C
recorrido: profundidad y anchura.
D E F
38
G H
A
Enfoques generales para la
B E F
secuencia de recorrido
C D G H I
B E F Recorrido en profundidad
C D G H I
D E F
40
G H
A
Recorrido en profundidad
B E F
“Preorden”
C D G H I
A
B
D
E • El recorrido preorden (NID) conlleva los siguientes
pasos, en los que el nodo raíz va antes que los
subárboles:
1. Recorrer el nodo raíz (N).
2. Recorrer el subárbol izquierdo (I) en preorden.
A
3. Recorrer el subárbol derecho (D) en preorden.
B C
D E F
41
G H
A
Recorrido en profundidad
B E F
“Preorden”
C D G H I
A A
Camino A ,B, D, E, C, F, G
B
1
C
C
D B
E 2 5
D E F G
3 4 6 7
B C
D E F
43
G H
A
Recorrido en profundidad
B E F
“Preorden”
C D G H I
public class Arbol {
……
public void preorden(){
if (raiz != null){
raiz.re_preorden(); public class Nodo {
A
} ……
B
} public void re_preorden(){
C
…… System.out.prin(dato);
D
} if (izda != null)
E
izda.re_preorden();
if (dcha != null)
dcha.re_preorden();
}
A ……
B C }
D E F
44
G H
A
Recorrido en profundidad
B E F
“Enorden ”
C D G H I
A
B
A
Camino D,B, E, A, F, C, G
4
C
B
A
2 6
B C
D E F G
D E F 1 3 5 7 46
G H
A
Recorrido en profundidad
B E F
“Postorden”
C D G H I
public class Arbol {
……
public void enorden(){
if (raiz != null){ public class Nodo {
raiz.re_enorden(); ……
A
} public void re_enorden(){
B
} if (izda != null)
C
…… izda.re_enorden();
D
}
E
System.out.prin(dato);
if (dcha != null)
dcha.re_enorden();
A
}
……
B C
}
D E F
47
G H
A
Recorrido en profundidad
B E F
“Postorden”
C D G H I
A
B
D
E • El recorrido postorden (IDN) procesa el nodo raíz
(post) después de que los subárboles izquierdo y
derecho se han procesado. Las etapas del
algoritmo son:
1. Recorrer e subárbol izquierdo (I) en postorden.
A
2. Recorrer el subárbol derecho (D) en postorden.
B C
3. Visitar el nodo raíz (N).
D E F
48
G H
A
Recorrido en profundidad
B E F
“Postorden”
C D G H I
• El algoritmo recursivo correspondiente para
un árbol T es:
si T no es vacío entonces
inicio
A Postorden (subárbol izquierdo de la raíz de T)
B
Postorden (subárbol derecho de la raíz de T)
C
ver los datos en el nodo raíz de T
D
E
fin
A
Camino D ,E, B, F , G, C, A
7
C
B
A
3 6
B C
D E F G
D E F 1 2 4 5 49
G H
A
Recorrido en profundidad
B E F
“Postorden”
C D G H I
public class Arbol {
……
public void postorden(){
if (raiz != null){ public class Nodo {
raiz.re_postorden(); ……
A
} public void re_postorden(){
B
} if (izda != null)
C
…… izda.re_postorden();
D
} if (dcha != null)
E
dcha.re_postorden();
System.out.prin(dato);
}
……
A
}
B C
D E F
50
G H
A
B C
D E F
52
G H
A
A
B
C
12
D
E
8 16
7 14
A
B C
D E F
55
G H
A
Implementación de un nodo de un
B E F
árbol binario de búsqueda
C D G H I
Declaración de típos
A Nombre Tipo de dato cadena (String)
B C numMat Tipo entero
D E F
56
G H
A
Implementación de un nodo de un
B E F
árbol binario de búsqueda
C D G H I
Nombre
numMat
izqda dcha
A
B
class NodoUniversitario {
C
int numMat;
String nombre;
D
E
NodoUniversitario izqda;
NodoUniversitario dcha;
D E F
58
G H
A
B E F Búsqueda
C D G H I
D E F
59
G H
A
B E F Búsqueda
C D G H I
// clase ArbolBusqueda
public boolean buscar(int buscado){
if (raiz != null)
return (raiz.buscarNodo(buscado) != null);
else
A
return false;
B
}
C // clase NodoUniversitario
public NodoUniversitario buscarNodo(int buscado){
D
if (buscado == numMat)
E return this;
else if (buscado < numMat)
if (izda != null)
return izda.buscarNodo (buscado);
else
return nuli;
A else if (buscado > numMat)
B C
if (dcha != null)
return dcha.buscarNodo (buscado);
D E F else
return null; 60
G H
}