Arboles Binarios
Short Description
Download Arboles Binarios...
Description
ARBOLES BINARIOS Ing. Juan A. Cañedo Trasviña
Árbol binario.
Un árbol binario es un árbol en el que cada nodo no puede tener más de dos hijos o descendientes. Es un conjunto de nodos que es, o bien el conjunto vació, o un conjunto que consta de un nodo raíz enlazado a dos árboles binarios disjuntos denominados subárbol izquierdo y subárbol derecho. Cada uno de estos subárboles es, a su vez, un árbol binario.
B
A
A
A
B
C
D
B C
Ing. D Juan A. Cañedo Trasviña F E
C
Árbol binario.
Un árbol binario es un árbol en el que cada nodo no puede tener más de dos hijos o descendientes. Es un conjunto de nodos que es, o bien el conjunto vació, o un conjunto que consta de un nodo raíz enlazado a dos árboles binarios disjuntos denominados subárbol izquierdo y subárbol derecho. Cada uno de estos subárboles es, a su vez, un árbol binario.
B
A
A
A
B
C
D
B C
Ing. D Juan A. Cañedo Trasviña F E
C
Representación de un árbol binario en la memoria.
Cada noto tiene la siguiente forma:
Raíz
izq info der
R A B
D C
Ing. Juan A. Cañedo Trasviña
E
Clase nodo de un A.B. class nodo{ nodo izq; nodo der; int dato; public nodo(int x) { dato=x; izq=der=null; } }
Ing. Juan A. Cañedo Trasviña
Algoritmo para crear un A.B. Procedimiento
crearbol(q:nodo)
escribe(‘Dame el dato=')
leer(q(dato)) mensaje(‘Tiene rama izquierda')
leer(op) Si op = 'S' Entonces p=crear nodo() q(izq) = p crearbol(p) En caso contrario
q(izq) = null mensaje(‘ Tiene rama derecha')
leer(op) Si op = 'S' Entonces p=crear nodo() q(der) =p crearbol(p) En caso contrario
q(der) = null
Ing. Juan A. Cañedo Trasviña
Operaciones basicas sobre un árbol binario
Recorrer árbol ya sea en:
Preorden Inorden Postorden
Insertar un nodo Eliminar un nodo Buscar nodo con cierta información Contar nodos Contar hojas. Nivel del árbol binario. Obtener el peso del árbol. Ing. Juan A. Cañedo Trasviña
Recorridos de un árbol de Búsqueda Binaria (ABB)
Recorrido en preorden (prefijo)
Visita la raíz. Recorre el subárbol izquierdo. Recorre el subárbol derecho.
RID
A
C
B
Preorden = A B D G C E H I F E
D
G
H
F
I
Ing. Juan A. Cañedo Trasviña
Recorridos de un árbol binario. Se denomina recorrido al proceso que permite acceder o visitar cada nodo que componen al árbol binario una sola vez. Las tres formas diferentes y todas ellas de naturaleza recursiva, los cuales son:
Preorden.
Inorden.
Postorden. Ing. Juan A. Cañedo Trasviña
Recorrido en Preorden. Examinar la raíz (escribe el dato del nodo). Recorrer el subárbol izquierdo. Recorrer el subárbol derecho.
A
C
B
Preorden: ABDGCEHIF E
D
G
H
F
I Ing. Juan A. Cañedo Trasviña
Algoritmo del recorrido en preorden public void Preorden(nodo p) { if (p != null) { Console.WriteLine(“Dato={0}”,p.dato); Preorden(p.izq); Preorden(p.der); } } Ing. Juan A. Cañedo Trasviña
Recorrido en Inorden (infijo) Recorre el subárbol izquierdo. Examinar la raíz (escribe el dato del nodo). Recorre el subárbol derecho.
A
C
B
Inorden: E
D
G
H
F
I Ing. Juan A. Cañedo Trasviña
DGBAHEI CF
Algoritmo del recorrido en Inorden public void Inorden(Nodo p) { if (p != null) { Inorden(p.izq); Console.WriteLine(“Dato={0}”,p.dato); Inorden(p.der); } } Ing. Juan A. Cañedo Trasviña
Recorridos en Postorden (postfijo)
Recorre el subárbol izquierdo. Recorre el subárbol derecho. Examinar la raíz (escribe el dato del nodo). A
E
D
G
Postorden
C
B
H
F
I
Ing. Juan A. Cañedo Trasviña
:GDBHIEFCA
Algoritmo del recorrido en postorden public void Postorden(Nodo p) { if (p != null) { Postorden(p.izq); Postorden(p.der); Console.WriteLine(“Dato={0}”,p.dato); } } Ing. Juan A. Cañedo Trasviña
Conversión de un árbol general en un árbol binario Deben enlazarse los hijos de cada nodo en forma horizontal (los hermanos). Deben enlazarse en forma vertical el nodo padre con el hijo que se encuentra más a la izquierda. Además, debe eliminarse el vínculo de ese padre con el resto de sus hijos. de haber realizado los pasos Después anteriores, pasaremos a rota el diagrama resultante 45 grados hacia la izquierda. Obteniendo como resultado un arbol binario.
Ing. Juan A. Cañedo Trasviña
Ejemplo de conversión de un árbol general en un árbol binario A B
E
C
F
D H
G L
M Ing. Juan A. Cañedo Trasviña
I
J
K
Resultado final un A.B. A B E
C F
G L
D H
M
I J Ing. Juan A. Cañedo Trasviña
Arboles de expresión aritmética Una aplicación muy importante de los arboles es la de poder almacenar una expresión aritmética en memoria. Un árbol de expresión es un árbol binario con las siguientes propiedades: Cada hoja debe ser un operando. Los nodos padres deben ser operadores. Los subárboles son subexpresiones en los que el nodo raíz es un operador. Ing. Juan A. Cañedo Trasviña
Ejemplo Dada la expresion a*(b+c)+d + * a
d +
b
c Ing. Juan A. Cañedo Trasviña
Árboles Binarios de Búsqueda (ABB) Ing. Juan A. Cañedo Trasviña
Árboles Binarios de Búsqueda
Un árbol es un ABB si éste es binario y sus nodos son subárboles de búsqueda binarios y contienen información ordenada tal que todos los elementos a la izquierda de la raíz son menores a la raíz y todos lo elementos a la derecha de la raíz son mayores a la raíz.
Ing. Juan A. Cañedo Trasviña
Características de un ABB
Todos los nodos a la izquierda son menores al padre. Todos los nodos a la derecha son mayores al padre. Y cada nodo solo pueden tener 2 hijos a lo mucho. 50 90
40 26 8
45 34
42
110
85 68
88
100
120 105
95 Ing. Juan A. Cañedo Trasviña
102
Clase nodo de un ABB Class Nodo{ nodo izq; nodo der; int dato; }
Ing. Juan A. Cañedo Trasviña
Inserción en un ABB La inserción es una operación que se puede realizar eficientemente en un árbol binario de búsqueda. La estructura crece conforme se inserten elementos al árbol. Los pasos que deben realizarse para insertar un elemento a un ABB son los siguientes:
Debe compararse el valor o dato a insertar con la raíz del árbol. Si es mayor, debe avanzarse hacia el subárbol derecho. Si es menor, debe avanzarse hacia el subárbol izquierdo. Ing. Juan A. Cañedo Trasviña
Inserción en un ABB (cont.)
Repetir sucesivamente el paso 1 hasta que se cumpla alguna de las siguientes condiciones
El subárbol derecho es igual a vació, o el subárbol izquierdo es igual a vació; en cuyo caso se procederá a insertar el elemento en el lugar que le corresponde. El valor o dato que quiere insertarse es igual a la raíz del árbol; en cuyo caso no se realiza la inserción.
Ing. Juan A. Cañedo Trasviña
Inserción en un ABB (cont.) Algoritmo Si NODO ≠ Null{ Si (INFOR < NODO.INFO) Regresar a INSERCION1 con NODO.IZQ e INFOR sino si ( INFOR > NODO.INFO) Regresar a INSERCION1 con NODO.DER e INFOR sino Escribir “El nodo ya se encuentra en el árbol” } // } si else CREA (OTRO) {Crear un nuevo nodo} Hacer OTRO.IZQ = null, OTRO.DER = null, OTRO.INFO = INFOR y NODO = OTRO } Ing. Juan A. Cañedo Trasviña
Inserción en un ABB (cont.)
Supóngase que quieren insertarse las siguientes los siguientes datos en un árbol binario de búsqueda que se encuentra vació.
120 –87 – 43 – 65 – 140 – 99 – 130 – 22 – 56
Ing. Juan A. Cañedo Trasviña
Inserción en un ABB (cont.) Solución 120 –87 – 43 – 65 – 140 – 99 – 130 – 22 – 56 120
140
87
99
43
130
65
22
56
Ing. Juan A. Cañedo Trasviña
Eliminar un nodo Para eliminar un nodo existen los siguientes casos: 1. 2. 3.
Si el elemento a borrar es Terminal (hoja), Si el elemento a borrar tiene un solo hijo, Si el elemento a borrar tiene los dos hijo,
Ing. Juan A. Cañedo Trasviña
Eliminar un nodo (cont.) Caso 1 Si el elemento a borrar es terminal (hoja), simplemente se elimina. aux = aux.izq = null
Ejemplo eliminar nodo 7
6
6 1
1
8 7
6
9
8 7
1 9
Ing. Juan A. Cañedo Trasviña
8 9
Eliminar un nodo (cont.)
Caso 2 Si el elemento a borrar tiene un solo hijo, entonces tiene que sustituirlo por el hijo que esta a su derecha.
Ejemplo: eliminar nodo 8 7 1
7
7 8
1
1
8
9
9 Ing. Juan A. Cañedo Trasviña
9
Ing. Juan A. Cañedo Trasviña
Eliminar un nodo (cont.) Caso 3 Si el elemento a borrar tiene los dos hijos, entonces se tienen que sustituir por el nodo que se encuentra más a la izquierda en el subárbol derecho, o por el nodo que se encuentra más a la derecha en el subárbol izquierdo.
Ejemplo: eliminar el 6
6 1
7
7 8 9
1
8
1 7
9
8 9
Buscar nodo con información procedimiento busqueda(nodo p; entero llave) si p != null entonces si llave != p(dato) entonces si llave < p(dato) entonces p
View more...
Comments