Está en la página 1de 31

Universidad Nacional de San Cristóbal de Huamanga IS241-Estructura de datos

Semana 12
Arboles
PRIMERA UNIDAD 3

Competencias

 Estructurar datos en orden jerárquico.


 Conocer la terminol
 ogía básica relativa a árboles.
 Distinguir los diferentes tipos de árboles binarios.
 Recorrer un árbol binario de tres formas diferentes.
 Reconocer la naturaleza recursiva de las operaciones con árboles.
 Representar un árbol binario con una estructura enlazada.
 Evaluar una expresión algebraica utilizando un árbol binario.
 Construir un árbol binario ordenado (de búsqueda).
Contenido
Árboles generales y terminología. Árboles binarios.. Estructura de un árbol binario.. Árbol de
expresión. Recorrido de un árbol. Árbol binario de búsqueda. Operaciones en árboles binarios de
búsqueda Implementación
.

Listas enlazadas
Mapa Conceptual
Lineales

Operaciones

Pilas

ESTRUCTURAS DINAMICAS
LINE
Colas

Arboles

No lineales

1
Universidad Nacional de San Cristóbal de Huamanga IS241-Estructura de datos

Grafos

VISTA OPERACIONAL DE LA ESTRUCTURA ÁRBOL

INTRODUCCION

El árbol es una estructura de datos dinámica no lineales y muy importante en la programación.


Los árboles se manipulan para organizar fórmulas algebraicas, para crear objetos en orden de tal
forma que las búsquedas sean muy eficientes y en aplicaciones diversas tales como inteligencia
artificial o algoritmos de cifrado. Casi todos los sistemas operativos almacenan sus archivos en
árboles o estructuras similares a árboles. Además de las aplicaciones citadas, los árboles se
utilizan en diseño de compiladores, procesado de texto y algoritmos de búsqueda.
En este tema se estudiara a esta estructura en sus tres perspectivas, nivel lógico, nivel de
implementación y aplicación.

1. ÁRBOLES GENERALES y TERMINOLOGÍA

1.1 Definiciones

2
Universidad Nacional de San Cristóbal de Huamanga IS241-Estructura de datos

 Un árbol consta de un conjunto finito de elementos, llamados nodos y de un conjunto


finito de líneas dirigidas, llamadas ramas, que conectan los nodos.

 Un árbol es un conjunto de uno o más nodos tales que:


Hay un nodo diseñado especialmente llamado raíz.
Los nodos restantes se dividen en n ≥ 0 conjuntos disjuntos, T1 ...Tn, tal que cada uno
de estos conjuntos es un árbol. A T1 ...Tn se les denomina subárboles del raíz.

 Estructura no lineal jerárquica en la que cada elemento tiene un único antecesor y


puede tener varios sucesores. En donde existe un único camino entre el primer nodo
de la estructura y cualquier otro nodo.

Vista de un árbol

1.2 Definición recursiva

El concepto de subárbol conduce a una definición recursiva de un árbol. Un árbol es un


conjunto de nodos que:
1. Es vacío.
2. O tiene un nodo determinado, llamado raíz, del que jerárquicamente descienden cero o
más subárboles, que son también árboles.

3
Universidad Nacional de San Cristóbal de Huamanga IS241-Estructura de datos

1.3 Terminología

a. El primer nodo de un árbol, normalmente dibujado en la posición superior, se denomina


raíz del árbol.
b. Las flechas que conectan un nodo con otro se llaman arcos o ramas.
c. Los nodos terminales, esto es, nodos de los cuales no se deduce ningún nodo, se
denominan hojas.
d. Los nodos que no son hojas se denominan nodos internos.
e. En un árbol donde una rama que va de un nodo n1 a un nodo n2, se dice que n1 es el
padre de n2 y que n2 es un hijo de n1.
f. n1 se llama ascendiente de n2, si n1 es el padre de n2 o si n1 es el padre de un
ascendiente de n2.
g. n2 se llama descendiente de n1, si n1 es un ascendiente de n2
h. Un camino de n1 a n2 es una secuencia de arcos contiguos que van de n1 a n2
i. La longitud de un camino es el número de arcos que contiene o, de forma equivalente,
el número de nodos del camino menos uno.
j. El nivel de un nodo es la longitud del camino que lo conecta al nodo raíz.
k. La profundidad o altura de un árbol es la longitud del camino más largo que conecta la
raíz a una hoja.
l. Un subárbol de un árbol es un subconjunto de nodos del árbol, conectados por ramas
del propio árbol, esto es, a su vez un árbol.
Sea S un subárbol de un árbol A: si para cada nodo n de SA, SA contiene también
todos los descendientes de n en A, SA se llama un subárbol completo de A.
m. Un árbol está equilibrado cuando, dado un número máximo k de hijos de cada nodo y

4
Universidad Nacional de San Cristóbal de Huamanga IS241-Estructura de datos

La altura del árbol h, cada nodo de nivel k < h-1 tiene exactamente k hijos.
El árbol está equilibrado perfectamente, si cada nodo de nivel l<h tiene exactamente k
hijos.

B C D

E F G H

I J K

profundidad(A)=0

profundidad(H)=2

altura=3

camino(A,K)={A,B,F,K}

camino(C,K)={}

5
Universidad Nacional de San Cristóbal de Huamanga IS241-Estructura de datos

2. ÁRBOLES BINARIOS
Es un árbol que solo puede tener dos como máximo de hijos, es decir dos

subárboles. Se conoce al nodo izquierdo como hijo izquierdo y al nodo

derecho como hijo derecho.

3. ESTRUCTURA DE UN ÁRBOL BINARIO

Un árbol binario es una estructura recursiva, que se divide en tres

subconjuntos distintos:

6
Universidad Nacional de San Cristóbal de Huamanga IS241-Estructura de datos

Conjunto del nodo raíz {R}

Conjunto del subárbol izquierdo de R {I1,I2,……In}

Conjunto del subárbol derecho de R{D1,D2,D3,….Dn}

I1 D1

D2
I2
I3

a. TAD DE UN ARBOL BINARIO

Creación de un árbol crearArbol (nombreArbol)


Comprobación del arbolVacio(nombreArbol) 
estado Booleano
Inserción de nodos insertar(padre, valorInfo,
posicion)
insertar(padre, valorInfo)
Borrado de nodos borrar(nombreArbol, valorInfo)
Búsqueda de un nodo buscar(nombreArbol, dato) 
informacion
buscar(nombreArbol,
información)referenciaNodo

7
Universidad Nacional de San Cristóbal de Huamanga IS241-Estructura de datos

Recorrido del árbol recorrer(nombreArbol,tipoReco


rrido)
Acceso a los nodos info(referenciaNodo) 
Informacion
primerHijo(referenciaNodo) 
enlace
hijos(referenciaNodo) 
{enlace}
eshoja(referenciaNodo) 
Booleano

Modificación de los asignarInfo(referenciaNodo,


nodos valorInformacion)
añadirHijo(referenciaNodo,
valorInfo)
quitarHijo(referenciaNodo,
valorInfo)

b. ESTRUCTURA DE UN ALBOL BINARIO CON NODOS

8
Universidad Nacional de San Cristóbal de Huamanga IS241-Estructura de datos

4. ÁRBOL DE EXPRESIÓN

Una muestra muy importante de los árboles binarios son los


árboles de expresiones. Una expresión es una secuencia de
componentes de léxicos (token). Un Token puede ser un
operando o bien un operador.

*
d
a * (b + c) + d

*
a
Expresión infija de un árbol de
b c
expresiones

9
Universidad Nacional de San Cristóbal de Huamanga IS241-Estructura de datos

* -

x a b
-

y z

Árbol de expresión ( x * (y - z) ) + (a - b)

Dibujar la representación en árbol binario de cada una de las


siguientes expresiones
a) Y * X / (A + B) *C
b) X * Y / A + B * C

Los árboles de expresiones se utilizan en las computadoras para


evaluar expresiones usadas en programas. El algoritmo más
sencillo para construir un árbol de expresión es aquel que lee una
expresión completa que contiene paréntesis. Una expresión con
paréntesis es aquella en que :
1) La prioridad se determina sólo por paréntesis.
2) La expresión completa se sitúa entre paréntesis.
A fin de ver la prioridad en las expresiones, considere la
expresión
a * c + e / g – (b + d)
Los operadores con prioridad más alta son * y /, es decir:
(a * c) + (e / g) – ( b + d)

10
Universidad Nacional de San Cristóbal de Huamanga IS241-Estructura de datos

Los operadores que siguen en orden de prioridad son + y -, que se


evalúan de izquierda a derecha. Por consiguiente, se puede
escribir: ((a * c) + (e / g)) – ( b + d)
Por último, la expresión completa entre paréntesis será:
(((a * c) + (e / g)) – ( b + d))

Algoritmo para la construcción de un árbol de expresión puede


expresarse en los siguientes pasos:
1) La primera vez que se encuentre un paréntesis a izquierda
crear un nodo que será el nodo raíz. Se llama a éste nodo
actual y se sitúa en una pila.
2) Cada vez que se encuentre un nuevo paréntesis a izquierda,
crear un nuevo nodo. Si el nodo actual no tiene un hijo
izquierdo, hacer el nuevo nodo el hijo izquierdo; en caso
contrario, hacerlo el hijo derecho. Hacer el nuevo nodo
actual y ponerlo en la pila
3) Cuando se encuentre un operando, crear un nuevo nodo y
asignar el operando a su campo de datos. Si el nodo actual
no tiene un hijo izquierdo, hacer el nuevo nodo el hijo
izquierdo; en caso contrario, hacerlo el hijo derecho.
4) Cuando se encuentre un operador, sacar el nodo cabeza de la
pila y situar el operador en el campo dato del nodo.
5) Ignorar el paréntesis derecho y los blancos.

* /

a b c d

a) ((a * b) + (c / d))

11
Universidad Nacional de San Cristóbal de Huamanga IS241-Estructura de datos

+ d

+ c

a b

b) (((a + b) + c)+ d)

+ *

- + + *

a x y b c d

c) (((-a) + (x + y)) / (( + b) * ( c * d)))

5. RECORRIDO DE UN ÁRBOL.
Para visualizar o consultar los datos almacenados en un
árbol se necesita recorrer el árbol o visitar los nodos del
mismo. Al contrario que las listas enlazadas, los árboles
binarios no tienen realmente un primer valor, un segundo
valor, un tercer valor, etc. Se puede afirmar que el nodo raíz
viene el primero, pero ¿Quién viene a continuación? Existen
diferentes métodos de recorrido de árbol ya que la mayoría
de las aplicaciones con árboles son bastante sensibles al
orden en el que se visitan los nodos, de forma que será
preciso elegir cuidadosamente el tipo de recorrido.

12
Universidad Nacional de San Cristóbal de Huamanga IS241-Estructura de datos

El Recorrido de un árbol binario, requiere 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 recorrido, profundidad y anchura.

En el Recorrido de Profundidad, el proceso exige un camino


desde la raíz a través de un hijo, al descendiente más lejano
del primer hijo, antes de proseguir a un segundo hijo. En
otras palabras, en el recorrido en profundidad, todos los
descendientes de un hijo se procesas antes del siguiente
hijo.

En el Recorrido en Anchura, el proceso se realiza


horizontalmente desde la raíz a todos sus hijos; a
continuación a los hijos de sus hijos y así sucesivamente
hasta que todos los nodos han sido procesados. En el
recorrido en anchura, cada nivel se procesa totalmente
antes de que comience el siguiente nivel.
Recorrido de un árbol supone visitar cada nodo sólo una vez.

Recorrido Preorden
El recorrido preorden (RID) conlleva los siguientes pasos, en
los que el nodo raíz va antes que los subárboles.
1) Visitar el Nodo Raíz ( R )
2) Recorrer el subárbol izquierdo ( I ) en Preorden.
3) Recorrer el subárbol derecho ( D) en Preorden.

13
Universidad Nacional de San Cristóbal de Huamanga IS241-Estructura de datos

1
B C

2 5
D E F G

3 4 6 7

Recorrido preorden A,B,D,E,C,F,G

Recorrido en Orden
El recorrido en Orden, procesa primero el subárbol izquierdo,
después la raíz y a continuación, el subárbol derecho. El
significado de in es que la raíz se procesa entre los subárboles.
Si el árbol no está vacío, el método implica los siguientes
pasos:
1) Recorrer el subárbol izquierdo ( I ) en Orden.
2) Visitar el Nodo Raíz ( R )
3) Recorrer el subárbol derecho ( D) en Orden.

4
B C

2 6
D E F G

1 3 5 7
Recorrido en Orden D,B,E,A,F,C,G

Recorrido Post Orden


El recorrido en Postorden procesa el nodo raíz después de que
los subárboles izquierdo y derecho se hayan procesado.
Comienza situándose en la hoja más a la izquierda y se procesa.
A continuación, se procesa su subárbol derecho. Por último, se

14
Universidad Nacional de San Cristóbal de Huamanga IS241-Estructura de datos

procesa el nodo raíz. Las etapas del algoritmo, si el árbol no


está vacío, son:
1) Recorrer el subárbol izquierdo ( I ) en PostOrden.
2) Recorrer el subárbol derecho ( D) en PostOrden.
3) Visitar el Nodo Raíz ( R )

7
B C

3 6
D E F G

1 2 4 5

Recorrido en PostOrden D,E,B,F,G,C,A

Deducir el orden de los elementos en cada uno de los tres


recorridos fundamentales de los árboles binarios siguientes:

a)

* /

a b c a

b)

+ d

+ c
15
a b
Universidad Nacional de San Cristóbal de Huamanga IS241-Estructura de datos

c)

+ *

- + + *

a x y b c d

6. ÁRBOL BINARIO DE BÚSQUEDA (ABB)

Se trata de árboles de orden 2 en los que se cumple que para cada nodo,

el valor de la clave de la raíz del subárbol izquierdo es menor que el valor

de la clave del nodo y que el valor de la clave raíz del subárbol derecho

es mayor que el valor de la clave del nodo.

a. OPERACIONES EN ÁRBOLES BINARIOS DE BÚSQUEDA.

16
Universidad Nacional de San Cristóbal de Huamanga IS241-Estructura de datos

El repertorio de operaciones que se pueden realizar sobre un ABB es parecido al que


realizábamos sobre otras estructuras de datos, más alguna otra propia de árboles:

 Buscar un elemento.

 Insertar un elemento.

 Borrar un elemento.

 Movimientos a través del árbol:

o Izquierda.

o Derecha.

o Raiz.

 Información:

o Comprobar si un árbol está vacío.

o Calcular el número de nodos.

o Comprobar si el nodo es hoja.

o Calcular la altura de un nodo.

o Calcular la altura de un árbol.

Buscar un elemento

Partiendo siempre del nodo raíz, el nodo de buscar un elemento se define de


forma recursiva.
 Si el árbol está vacío, terminamos la búsqueda: el elemento no está en
el árbol.
 Si el valor del nodo raíz es igual que el del elemento que buscamos,
terminamos la búsqueda con éxito.
 Si el valor del nodo raíz es mayor que el elemento que buscamos,
continuaremos la búsqueda en el árbol izquierdo.
 Si el valor del nodo raíz es menor que el elemento que buscamos,
continuaremos la búsqueda en el árbol derecho.

17
Universidad Nacional de San Cristóbal de Huamanga IS241-Estructura de datos

El valor de retorno de una función de búsqueda en un ABB puede ser un


referencia al nodo encontrado, o NULL, si no se ha encontrado.

Insertar un elemento

Para insertar un elemento nos basamos en el algoritmo de búsqueda. Si el elemento


está en el árbol no lo insertaremos. Si no lo está, lo insertaremos a continuación del
último nodo visitado.

Necesitamos un referencia auxiliar para conservar una referencia al padre del nodo
raíz actual. El valor inicial para ese referencia es NULL.

 Padre = NULL

 nodo = Raiz

 Bucle: mientras actual no sea un árbol vacío o hasta que se encuentre el


elemento.

o Si el valor del nodo raíz es mayor que el elemento que


buscamos, continuaremos la búsqueda en el árbol izquierdo:
Padre=nodo, nodo=nodo->izquierdo.

o Si el valor del nodo raíz es menor que el elemento que


buscamos, continuaremos la búsqueda en el árbol derecho:
Padre=nodo, nodo=nodo->derecho.

 Si nodo no es NULL, el elemento está en el árbol, por lo tanto salimos.

 Si Padre es NULL, el árbol estaba vacío, por lo tanto, el nuevo árbol sólo
contendrá el nuevo elemento, que será la raíz del árbol.

 Si el elemento es menor que el Padre, entonces insertamos el nuevo


elemento como un nuevo árbol izquierdo de Padre.

 Si el elemento es mayor que el Padre, entonces insertamos el nuevo


elemento como un nuevo árbol derecho de Padre.

Este modo de actuar asegura que el árbol sigue siendo ABB.

Borrar el elemento

18
Universidad Nacional de San Cristóbal de Huamanga IS241-Estructura de datos

Para borrar un elemento también nos basamos en el algoritmo de búsqueda. Si el


elemento no está en el árbol no lo podremos borrar. Si está, hay dos casos posibles:

1. Se trata de un nodo hoja: en ese caso lo borraremos directamente.

2. Se trata de un nodo rama: en ese caso no podemos eliminarlo, puesto que


perderíamos todos los elementos del árbol de que el nodo actual es padre. En
su lugar buscamos el nodo más a la izquierda del subárbol derecho, o el más
a la derecha del subárbol izquierdo e intercambiamos sus valores. A
continuación eliminamos el nodo hoja.

Necesitamos un referencia auxiliar para conservar una referencia al padre del nodo raíz
actual. El valor inicial para ese referencia es NULL.

 Padre = NULL

 Si el árbol está vacío: el elemento no está en el árbol, por lo tanto salimos


sin eliminar ningún elemento.

 (1) Si el valor del nodo raíz es igual que el del elemento que buscamos,
estamos ante uno de los siguientes casos:

o El nodo raíz es un nodo hoja:

 Si 'Padre' es NULL, el nodo raíz es el único


del árbol, por lo tanto el referencia al árbol debe ser
NULL.

 Si raíz es la rama derecha de 'Padre',


hacemos que esa rama apunte a NULL.

 Si raíz es la rama izquierda de 'Padre',


hacemos que esa rama apunte a NULL.

 Eliminamos el nodo, y salimos.

o El nodo no es un nodo hoja:

 Buscamos el 'nodo' más a la izquierda del


árbol derecho de raíz o el más a la derecha del árbol
izquierdo. Hay que tener en cuenta que puede que
sólo exista uno de esos árboles. Al mismo tiempo,

19
Universidad Nacional de San Cristóbal de Huamanga IS241-Estructura de datos

actualizamos 'Padre' para que apunte al padre de


'nodo'.

 Intercambiamos los elementos de los nodos


raíz y 'nodo'.

 Borramos el nodo 'nodo'. Esto significa volver


a (1), ya que puede suceder que 'nodo' no sea un
nodo hoja. (Ver ejemplo 3)

 Si el valor del nodo raíz es mayor que el elemento que buscamos,


continuaremos la búsqueda en el árbol izquierdo.

 Si el valor del nodo raíz es menor que el elemento que buscamos,


continuaremos la búsqueda en el árbol derecho.

Ejemplo 1 para Borrar una hoja

En el árbol de ejemplo, borrar el nodo 3.

1. Localizamos el nodo a borrar, al tiempo que mantenemos un referencia a


'Padre'.

2. Hacemos que el referencia de 'Padre' que apuntaba a 'nodo', ahora apunte


a NULL.

3. Borramos el 'nodo'.

Elemplo 2 Borrar un nodo rama con el intercambio de un nodo hija

20
Universidad Nacional de San Cristóbal de Huamanga IS241-Estructura de datos

En el árbol de ejemplo, borrar el nodo 4.

1. Localizamos el nodo a borrar ('raíz').

2. Buscamos el nodo más a la derecha del árbol izquierdo de 'raíz', en este


caso el 3, al tiempo que mantenemos un referencia a 'Padre' a 'nodo'.

3. Intercambiamos los elementos 3 y 4.

4. Hacemos que el referencia de 'Padre' que apuntaba a 'nodo', ahora apunte


a NULL.

5. Borramos el 'nodo'.

Ejemplo 3 borrar un nodo rama con intercambio de nodo rama

En éste borraremos el elemento 6

1. Localizamos el nodo a borrar ('raíz').

21
Universidad Nacional de San Cristóbal de Huamanga IS241-Estructura de datos

2. Buscamos el nodo más a la izquierda del árbol derecho de 'raíz', en este


caso el 12, ya que el árbol derecho no tiene nodos a su izquierda, si optamos
por la rama izquierda, estaremos en un caso análogo. Al mismo tiempo que
mantenemos un referencia a 'Padre' a 'nodo'.

3. Intercambiamos los elementos 6 y 12.

4. Ahora tenemos que repetir el bucle para el nodo 6 de nuevo, ya que no


podemos eliminarlo.

5. Localizamos de nuevo el nodo a borrar ('raíz').

6. Buscamos el nodo más a la izquierda del árbol derecho de 'raíz', en este


caso el 16, al mismo tiempo que mantenemos un referencia a 'Padre' a 'nodo'.

7. Intercambiamos los elementos 6 y 16.

8. Hacemos que el referencia de 'Padre' que apuntaba a 'nodo', ahora apunte


a NULL.

9. Borramos el 'nodo'.

7. IMPLEMENTACIÓN

22
Universidad Nacional de San Cristóbal de Huamanga IS241-Estructura de datos

Administración de un árbol binario ordenado


public void insertar (int info)
{
Nodo nuevo;
nuevo = new Nodo ();
nuevo.info = info;
nuevo.izq = null;
nuevo.der = null;
if (raiz == null)
raiz = nuevo;
else
{
Nodo anterior = null, reco;
reco = raiz;
while (reco != null)
{
anterior = reco;
if (info < reco.info)
reco = reco.izq;
else
reco = reco.der;
}
if (info < anterior.info)
anterior.izq = nuevo;
else
anterior.der = nuevo;
}
}
Creamos un nodo y disponemos los referencias izq y der a null, guardamos la información
que llega al método en el nodo.
Si el árbol está vacío, apuntamos raíz al nodo creado; en caso de no estar vacío, dentro
de una estructura repetitiva vamos comparando info con la información del nodo, si info es
mayor a la del nodo descendemos por el subárbol derecho en caso contrario
descendemos por el subárbol izquierdo.
Cuando se encuentra un subárbol vacío insertar el nodo en dicho subárbol. Para esto
llevamos un referencia anterior dentro del while.
private void imprimirPre (Nodo reco)
{
if (reco != null)
{
System.out.print(reco.info + " ");
imprimirPre (reco.izq);
imprimirPre (reco.der);
}
}

public void imprimirPre ()


{
imprimirPre (raiz);
System.out.println();
}

23
Universidad Nacional de San Cristóbal de Huamanga IS241-Estructura de datos

El método imprimirPre(), es decir el no recursivo se encarga de llamar al método recursivo


pasando la dirección del nodo raiz.
El método recursivo void imprimirPre (Nodo reco) lo primero que verifica con un if si reco
está apuntando a un nodo (esto es verdad si reco es distinto a null), en caso afirmativo
ingresa al bloque del if y realiza:
- Visitar la raiz.
- Recorrer el subárbol izquierdo en pre-orden.
- Recorrer el subárbol derecho en pre-orden.

La visita en este caso es la impresión de la información del nodo y los recorridos son las
llamadas recursivas pasando las direcciones de los subárboles izquierdo y derecho.
Los algoritmos de los recorridos en entreorden y postorden son similares. La diferencia es
que la visita la realizamos entre las llamadas recursivas en el recorrido en entre orden:
private void imprimirEntre (Nodo reco)
{
if (reco != null)
{
imprimirEntre (reco.izq);
System.out.print(reco.info + " ");
imprimirEntre (reco.der);
}
}
y por último en el recorrido en postorden la visita la realizamos luego de las dos llamadas
recursivas:
private void imprimirPost (Nodo reco)
{
if (reco != null)
{
imprimirPost (reco.izq);
imprimirPost (reco.der);
System.out.print(reco.info + " ");
}
}

Metodo principal

public static void main (String [] ar)

ArbolBinarioOrdenado abo = new ArbolBinarioOrdenado ();

abo.insertar (100);

abo.insertar (50);

24
Universidad Nacional de San Cristóbal de Huamanga IS241-Estructura de datos

abo.insertar (25);

abo.insertar (75);

abo.insertar (150);

System.out.println ("Impresion preorden: ");

abo.imprimirPre ();

System.out.println ("Impresion entreorden: ");

abo.imprimirEntre ();

System.out.println ("Impresion postorden: ");

abo.imprimirPost ();

8. Ejercicio

Confeccionar una clase que permita insertar un entero en un árbol binario ordenado
verificando que no se encuentre previamente dicho número.

Desarrollar los siguientes métodos:

1 - Retornar la cantidad de nodos del árbol.

2 - Retornar la cantidad de nodos hoja del árbol.

3 - Imprimir en entre orden.

4 - Imprimir en entre orden junto al nivel donde se encuentra dicho nodo.

5 - Retornar la altura del árbol.

6 - Imprimir el mayor valor del árbol.

7 - Borrar el nodo menor del árbol.

Resultado

25
Universidad Nacional de San Cristóbal de Huamanga IS241-Estructura de datos

Para verificar si existe un elemento de información en el árbol disponemos una referencia


reco en el nodo apuntado por raiz. Dentro de un while verificamos si la información del
parámetro coincide con la información del nodo apuntado por reco, en caso afirmativo
salimos del método retornando true, en caso contrario si la información a buscar es mayor
a la del nodo procedemos a avanzar reco con la dirección del subárbol derecho:

public boolean existe(int info) {

Nodo reco=raiz;

while (reco!=null) {

if (info==reco.info)

return true;

else

if (info>reco.info)

reco=reco.der;

else

reco=reco.izq;

return false;

Para retornar la cantidad de nodos del árbol procedemos a inicializar un atributo de la


clase llamado cant con cero. Llamamos al método recursivo y en cada visita al nodo
incrementamos el atributo cant en uno:

private void cantidad(Nodo reco) {

if (reco!=null) {

cant++;

cantidad(reco.izq);

26
Universidad Nacional de San Cristóbal de Huamanga IS241-Estructura de datos

cantidad(reco.der);

public int cantidad() {

cant=0;

cantidad(raiz);

return cant;

Para imprimir todos los nodos en entre orden junto al nivel donde se encuentra
planteamos un método recursivo que llegue la referencia del nodo a imprimir junto al nivel
de dicho nodo. Desde el método no recursivo pasamos la referencia a raiz y un uno (ya
que raiz se encuentra en el primer nivel)

Cada vez que descendemos un nivel le pasamos la referencia del subárbol respectivo
junto al nivel que se encuentra dicho nodo:

private void imprimirEntreConNivel (Nodo reco,int nivel) {

if (reco != null) {

imprimirEntreConNivel (reco.izq,nivel+1);

System.out.print(reco.info + " ("+nivel+") - ");

imprimirEntreConNivel (reco.der,nivel+1);

public void imprimirEntreConNivel () {

27
Universidad Nacional de San Cristóbal de Huamanga IS241-Estructura de datos

imprimirEntreConNivel (raiz,1);

System.out.println();

Para obtener la altura del árbol procedemos en el método no recursivo a inicializar el


atributo altura con el valor cero. Luego llamamos al método recursivo con la referencia a
raiz que se encuentra en el nivel uno. Cada vez que visitamos un nodo procedemos a
verificar si el parámetro nivel supera al atributo altura, en dicho caso actualizamos el
atributo altura con dicho nivel.

private void retornarAltura (Nodo reco,int nivel) {

if (reco != null) {

retornarAltura (reco.izq,nivel+1);

if (nivel>altura)

altura=nivel;

retornarAltura (reco.der,nivel+1);

public int retornarAltura () {

altura=0;

retornarAltura (raiz,1);

return altura;

Para imprimir el mayor valor del árbol debemos recorrer siempre por derecha hasta
encontrar un nodo que almacene null en der:

28
Universidad Nacional de San Cristóbal de Huamanga IS241-Estructura de datos

public void mayorValorl() {

if (raiz!=null) {

Nodo reco=raiz;

while (reco.der!=null)

reco=reco.der;

System.out.println("Mayor valor del árbol:"+reco.info);

Para borrar el menor valor del árbol lo primero que comprobamos es si el subárbol
izquierdo es nulo luego el menor del árbol es el nodo apuntado por raiz. Luego si el
subárbol izquierdo no está vacío procedemos a descender siempre por la izquierda
llevando un referencia en el nodo anterior. Cuando llegamos al nodo que debemos borrar
procedemos a enlazar el referencia izq del nodo que se encuentra en el nivel anterior con
la referencia del subárbol derecho del nodo a borrar:

public void borrarMenor() {

if (raiz!=null) {

if (raiz.izq==null)

raiz=raiz.der;

else {

Nodo atras=raiz;

Nodo reco=raiz.izq;

while (reco.izq!=null) {

atras=reco;

29
Universidad Nacional de San Cristóbal de Huamanga IS241-Estructura de datos

reco=reco.izq;

atras.izq=reco.der;

Demostración

public static void main (String [] ar)

ArbolBinarioOrdenado abo = new ArbolBinarioOrdenado ();

abo.insertar (100);

abo.insertar (50);

abo.insertar (25);

abo.insertar (75);

abo.insertar (150);

System.out.println ("Impresion entreorden: ");

abo.imprimirEntre ();

System.out.println ("Cantidad de nodos del árbol:"+abo.cantidad());

System.out.println ("Cantidad de nodos hoja:"+abo.cantidadNodosHoja());

System.out.println ("Impresion en entre orden junto al nivel del nodo.");

abo.imprimirEntreConNivel();

30
Universidad Nacional de San Cristóbal de Huamanga IS241-Estructura de datos

System.out.print ("Artura del arbol:");

System.out.println(abo.retornarAltura());

abo.mayorValorl();

abo.borrarMenor();

System.out.println("Luego de borrar el menor:");

abo.imprimirEntre ();

31

También podría gustarte