0% encontró este documento útil (0 votos)
114 vistas9 páginas

Estructura y Operaciones de Árboles Binarios

Los árboles son estructuras de datos jerárquicas y dinámicas formadas por nodos y punteros. Se explican las características de los árboles en general y de los árboles binarios en particular, incluyendo su representación, tipos, operaciones y aplicaciones. Se detallan las implementaciones de los nodos, árboles y métodos comunes como recorridos e inserción/eliminación.

Cargado por

Nathy Ruiz
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
114 vistas9 páginas

Estructura y Operaciones de Árboles Binarios

Los árboles son estructuras de datos jerárquicas y dinámicas formadas por nodos y punteros. Se explican las características de los árboles en general y de los árboles binarios en particular, incluyendo su representación, tipos, operaciones y aplicaciones. Se detallan las implementaciones de los nodos, árboles y métodos comunes como recorridos e inserción/eliminación.

Cargado por

Nathy Ruiz
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd

ARBOLES

Son estructuras de datos jerarquizadas, organizadas y dinámicas, formada por un


conjunto de nodos y un conjunto de punteros que conectan pares de nodos, con
jerárquica porque los componentes están a distinto nivel, igualmente se considera
organizada porque importa la forma en que esté dispuesto el contenido y dinámica
porque su forma, tamaño y contenido pueden variar durante la ejecución.

Al primer nodo se le conoce con el nombre de RAÍZ.

Representación de un árbol

Características
Todo árbol tiene un único nodo raíz. 
Todo nodo, excepto la raíz está conectado por medio de un puntero o arista a un
único nodo, conocido como nodo padre, que le(s) antecede. Hay un único camino
desde la raíz a cada nodo. El número de punteros que atraviesa es la longitud del
camino. 

Todo nodo que no tiene más ramificaciones se le conoce como nodo terminal u
hoja. Padre es el antecesor inmediato de un nodo, Hijo, es cualquiera de sus
descendientes inmediatos.  Hermano de un nodo, es otro nodo con el mismo
padre.  El grado de un nodo cualquiera, es el número de descendientes directos
que tenga.

Grado de un Árbol, es el máximo grado de todos los nodos.


Nivel, es el número de punteros o aristas o arcos que deben ser recorridos para
llegar a un determinado nodo.
 Altura de un árbol, es el máximo número de niveles de todos los nodos del árbol.
Aplicaciones de Árboles
 Representación de un árbol genealógico.
 Representación de operaciones algebraicas.
 Para realizar la administración de directorios como para UNIX, Linux, Windows.
 Crear directorio de ficheros, etc.

Árbol binario
Son los árboles cuyo grado es 2 como máximo.

Es decir,  un árbol es binario si tiene 0, 1 o 2 hijos


(a) es un nodo binario de un solo nodo, por lo tanto A es la raíz en el nivel 0.
(b) Árbol binario de 3 nodos. A es la raíz de grado 2 por tener 2 hijos.
(c) Árbol binario de 3 nodos. A es la raíz de grado 1, B es de grado 1 por tener 1
hijo. El árbol solo tiene hijos derechos y ningún hijo izquierdo.
(d) Árbol binario de 2 nodos. A es la raíz de grado 1, B es de grado 0 por no tener
hijos. El árbol solo tiene hijos izquierdos y ningún hijo derecho.
(e) Árbol binario de 5 nodos, de longitud 3 con E y D como hojas.
Ejemplo

Tipo de Árboles Binarios


Los árboles binarios completos o llenos. Cada nodo tiene 2 hijos, así en el nivel 0
(nodo raíz):
En el nivel cero (2^0) existe un nodo, luego …
En el nivel uno  (2^1) existen dos nodos
En el nivel dos  (2^2) existen cuatro nodos, etc.   
Así por inducción: En el nivel k  hay 2^k  nodos

Recorrido de un Árbol Binario


Los árboles binarios se pueden recorrer de la siguiente manera:

Pre-Orden (Prefijo):  RID
 Visitar la raiz    
 Recorrer todo el sub-arbol izquierdo.    
 Recorrer todo el sub-arbol derecho.  
En-Orden (Infijo): IRD
 Recorrer todo el sub-arbol izquierdo.    
 Visitar la raiz.    
 Recorrer todo el sub-arbol derecho. 
Post-Orden (Postfijo): IDR  
 Recorrer todo el sub-arbol izquierdo.    
 Recorrer todo el sub-arbol derecho.    
 Visitar la raíz.
Implementación de la clase Nodo
public class Nodo  
{
public String  codigo;
public String  nombre;
public String sueldo ;

public Nodo  izq;


public Nodo  der;

public Nodo(String cod, String nom, String suel)


{
codigo  = cod;
nombre = nom;
sueldo  = suel;
Izq = null; der = null;      
 }
}

Implementación de la Clase Árbol


public class Arbol  
{
Nodo raiz ;
public Arbol()        
{ raiz = null ;
}
}
Algunos Métodos Importantes
public class Arbol
{
Nodo raiz ;
public int tamaño(Nodo p)
  {
if(p==null) return 0;
else return 1+ tamaño(p.izq) +  tamaño(p.der);
}
public int altura(Nodo p)        
{
if(p==null) return -1;
else return 1+ Math.max( tamaño(p.izq), tamaño(p.der) );
}
}

Operaciones básicas de los árboles binarios de búsqueda


Hay dos operaciones básicas, inserción y eliminación.

Inserción
Inserción en un árbol binario es sencillo, hay que tener cuidado de no romper la
estructura ni el orden del árbol.

Cuando se inserta un nuevo nodo en el árbol se debe tener en cuenta que cada
nodo no puede tener más de dos hijos, por esta razón si un nodo ya tiene 2 hijos,
el nuevo nodo nunca se podrá insertar como su hijo. Con esta restricción se
asegura mantener la estructura del árbol, pero aún nos falta mantener el orden.

Para localizar el lugar adecuado del árbol donde insertar el nuevo nodo se realizan
comparaciones entre los nodos del árbol y el elemento a insertar. El primer nodo
que se compara es la raíz, si el nuevo nodo es menor que la raíz, la búsqueda
prosigue por el nodo izquierdo de éste. Si el nuevo nodo fuese mayor, la búsqueda
seguiría por el hijo derecho de la raíz.

Este procedimiento es recursivo, y su condición de parada es llegar a un nodo que


no tenga hijo en la rama por la que la búsqueda debería seguir. En este caso el
nuevo nodo se inserta en ese hueco, como su nuevo hijo.
Vamos a verlo con un ejemplo sobre el siguiente árbol:
Se quiere insertar el elemento 6.
Lo primero es comparar el nuevo elemento con la raíz. Como 6 > 4, entonces la
búsqueda prosigue por el lado derecho. Ahora el nuevo nodo se compara con el
elemento 8. En este caso 6 < 8, por lo que hay que continuar la búsqueda por la
rama izquierda. Como la rama izquierda de 8 no tiene ningún nodo, se cumple la
condición de parada de la recursividad y se inserta en ese lugar el nuevo nodo.

Borrar
El borrado en árboles binarios de búsqueda es otra operación bastante sencilla
excepto en un caso. Vamos a ir estudiando los distintos casos. Tras realizar la
búsqueda del nodo a eliminar observamos que el nodo no tiene hijos. Este es el
caso más sencillo, únicamente habrá que borrar el elemento y ya habremos
concuído la operación.

Si tras realizar la búsqueda nos encontramos con que tiene un sólo hijo. Este caso
también es sencillo, para borrar el nodo deseado, hacemos una especie
de puente, el padre del nodo a borrar pasa a apuntar al hijo del nodo borrado.

Por último, el caso más complejo, si el nodo a borrar tiene dos hijos. En este caso
se debe sustitui el nodo a borrar por mayor de los nomdos menores del nodo
borrado, o por el menor de los nodos mayores de dicho nodo. Una vez realizada
esta sustitución se borrra el nodo que sustituyó al nodo eliminado (operación
sencilla ya que este nodo tendrá un hijo a lo sumo).

Sobre el siguiente árbol queremos eliminar el elemento 6. Tenemos dos opciones


para sustituirlo:
 El menor de sus mayores: 7.
 El mayor de sus menores: 4.
Vamos a sustituirlo por el 7 (por ejemplo). El árbol resultante sería el siguiente,
tras eliminar también el elemento 7 de su ubicación original.

Otras operaciones

En los árboles de búsqueda la operación buscar es muy eficiente. El algoritmo


compara el elemento a buscar con la raíz, si es menor continua la búsqueda por la
rama izquierda, si es mayor continua por la izquierda. Este procedimiento se
realiza recursivamente hasta que se encuentra el nodo o hasta que se llega al final
del árbol.

Otra operación importante en el árbol es el recorridod el mismo. El recorrido se


puede realizar de tres formas diferentes:

 Preorden: Primero el nodo raíz, luego el subárbol izquierdo y a continuación


el subárbol derecho.
 Inorden: Primero el subárbol izquierdo, luego la raíz y a continuación el
subárbol derecho.
 Postorden: Primero el subárbol izquierdo, luego el subárbol derecho y a
continuación la raíz.
Ejemplo
Implementar una función no recursiva para recorrer un árbol binario en inorden.

#include < pilas.h>


#include < arbolesB.h>

/*---------------------------------------*/

void inordenNR(ArbolB T,void (* EscribirElemento)(void *),int tamano)


{
NodoB nodoActual,aux;
void *et;
Pila p;
int fin;
int faltaHD; /*Indica si falta el hijo derecho*/

p=CrearPila(sizeof(NodoB));
et=malloc(tamano);
if(!et){ .... /*Error:Sin memoria*/
}
aux=NODOB_NULO;
Push(&aux,p);
nodoActual=RaizB(T);
fin=0;
while(!fin)
{
while(nodoActual!=NODOB_NULO)
{
Push(&nodoActual,p);
nodoActual=HijoIzqdaB(nodoActual,T);
}
Tope(&nodoActual,p);
Pop(p);
if (nodoActual!=NODOB_NULO)
{
EtiquetaArbolB(et,nodoActual,T);
(*EscribirElemento)(et);
nodoActual=HijoDrchaB(nodoActual,T);
} else fin=1;
}
free(et);
DestruirPila(p);
}
Ejercicio Asignado

1. Se tiene una función valor tal que dado un valor de tipo char (una letra del


alfabeto) devuelve un valor entero asociado a dicho identificador, también la
existencia de un árbol de expresión T cuyos nodos hoja son letras del
alfabeto y cuyos nodos interiores son los caracteres *,+,-,/.

Diseñar una función que tome como parámetros un nodo y un árbol binario
y devuelva el resultado entero de la evaluación de la expresión
representada.

2. El recorrido en preorden de un determinado árbol binario es:


GEAIBMCLDFKJH y en inorden IABEGLDCFMKHJ .

Resolver:
A) Dibujar el árbol binario.
B) Dar el recorrido en postorden.
C) Diseñar una función para dar el recorrido en postorden dado el recorrido
en preorden e inorden y escribir un programa para comprobar el resultado
del apartado anterior

También podría gustarte