Está en la página 1de 36

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.
A
A A

B C
B C B C

D Ing. D E Trasviña F
Juan A. Cañedo
Representación de un árbol binario en
la memoria.
 Cada noto tiene la siguiente forma:

izq info der Raíz

A D

B C E
Ing. Juan A. Cañedo Trasviña
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
Ing. Juan A. Cañedo Trasviña
q(der) = null
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. RID
 Recorre el subárbol derecho.
A

B C

Preorden = ABDGCEHIF
D E F

G H 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.

B C

Preorden: ABDGCEHIF
D E F

G H 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.

B C

Inorden: D G B A H E I C F
D E F

G H I
Ing. Juan A. Cañedo Trasviña
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).

B C Postorden : G D B H I E F C A

D E F

G H I Ing. Juan A. Cañedo Trasviña


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.
 Después de haber realizado los pasos
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 C D

E F G H I J K

L M

Ing. Juan A. Cañedo Trasviña


Resultado final un A.B.
A

E C

F G D

L H

M I
J
Ing. Juan A. Cañedo Trasviña

K
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

* d

a +

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
40 90

26 45 110
85

8 34 42 68 88 100 120

95 105
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

87 140

99
43 130

22 65

56 Ing. Juan A. Cañedo Trasviña


Eliminar un nodo

Para eliminar un nodo existen los siguientes


casos:
1. Si el elemento a borrar es Terminal (hoja),
2. Si el elemento a borrar tiene un solo hijo,
3. 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 6

1 1 8 1
8 8

7 9 7 9 9
Ing. Juan A. Cañedo Trasviña
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 7 7

1 8 1 8 1 9

9 9
Ing. Juan A. Cañedo Trasviña
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 7 7

1 1 8 1 8
8
7 9 9
7 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 <- p(izq)
busqueda( p, llave)
en caso contrario
p <- p(der)
busqueda(p, llave)
en caso contrario
mensaje(’’nodo encontrado’’)
Contar nodos
//cuenta los nodos que hay en el árbol
public static int nodo (nodo raiz)
{
if (raiz == null)
return 0;
else
return (1+ Nodo( raiz.der) + Nodo( raiz.izq))
}
Sumar los nodos
//suma los nodos que hay en el árbol
public static int sumaNodo( nodo raiz)
{
if(raiz == null)
return 0;
else
return (sumaNodo (raiz.der) + sumaNodo
(raiz.izq) )
}
Ing. Juan A. Cañedo Trasviña
Contar hojas.
// Cuenta hojas de un árbol
public int contarHojas (Nodo raiz) {
if (raiz = = null) return 0;
If ((raiz.der == null) && (raiz.izq == null))
return 1;
else
return contarHojas (raiz.izq) + contarHojas (raiz.der)
}

Ing. Juan A. Cañedo Trasviña

También podría gustarte