You are on page 1of 10

Programacin IV.

Gua 8 Facultad: Ingeniera Escuela: Computacin Asignatura: Programacin IV

Tema: Arboles en C#.


Objetivos Especficos

Definir el concepto de la estructura de datos Arbol. Implementar la estructura de datos Arbol en C #.

Materiales y Equipo
Gua Nmero 8. Computadora con programa Microsoft Visual C#.

Introduccin Terica
Definicin de Arbol Binario.
Un rbol binario es una estructura de datos de tipo rbol en donde cada uno de los nodos del rbol puede tener 0, 1, 2 sub rboles llamados de acuerdo a su caso como: 1. Si el nodo raz tiene 0 relaciones se llama hoja. 2. Si el nodo raz tiene 1 relacin a la izquierda, el segundo elemento de la relacin es el subrbol izquierdo. 3. Si el nodo raz tiene 1 relacin a la derecha, el segundo elemento de la relacin es el subrbol derecho.

2 Programacin IV, Gua 8

La Figura anterior muestra un rbol binario sencillo de tamao 9 y altura 3,con un nodo raz cuyo valor es 2.

La Figura muestra un rbol binario esencialmente completo. Existen cuatro tipos de rbol binario: 1. Arboles Binarios Distintos. 2. Arboles Binarios Similares. 3. Arboles Binarios Equivalentes. 4. Arboles Binarios Completos. A continuacin se har una breve descripcin de los diferentes tipos de rbol binario as como un ejemplo de cada uno de ellos.

Arboles Binarios Distintos.


Se dice que dos rboles binarios son distintos cuando sus estructuras son diferentes. Ejemplo:

Programacin IV. Gua 8

Arboles Binarios Similares.


Dos rboles binarios son similares cuando sus estructuras son idnticas, pero la informacin que contienen sus nodos es diferente. Ejemplo:

Arboles Binarios Equivalentes.


Son aquellos arboles que son similares y que adems los nodos contienen la misma informacin. Ejemplo:

Arboles Binarios Completos.


Son aquellos arboles en los que todos sus nodos excepto los del ltimo nivel, tiene dos hijos: el subrbol izquierdo y el subrbol derecho. Los nodos del rbol binario sern representados como registros que contendrn como mnimo tres campos. En un campo se almacenar la informacin del nodo. Los dos restantes se utilizarn para apuntar al subrbol izquierdo y derecho del subrbol en cuestin. Cada nodo se representa grficamente de la siguiente manera:

Procedimiento

4 Programacin IV, Gua 8

Ejemplo 1. Implementaremos un rbol binario de bsqueda en C#:


1. Crear un proyecto de consola y nombrarlo arbol. 2. Agregar el siguiente cdigo: using System; using System.Collections.Generic; using System.Text; namespace arboles { public class NodoT { public NodoT NodoIzquierdo; public int Informacion; public NodoT NodoDerecho; //Constructor public NodoT( ) { this.NodoIzquierdo = null; this.Informacion = 0; this.NodoDerecho = null; } } class Program { static void Main(string[ ] args) { int Opcion = 0; NodoT Raiz = null; int Dato; do { Opcion = Menu( ); switch (Opcion) { case 1: Console.Write("Valor del Nuevo Nodo: "); Dato = int.Parse(Console.ReadLine( )); if (Raiz == null) { NodoT NuevoNodo = new NodoT( ); NuevoNodo.Informacion = Dato; Raiz = NuevoNodo; } else { Insertar(Raiz, Dato); } Console.Clear( ); break; case 2: Recorrer(Raiz); Console.WriteLine("Fin del Recorrido,..."); Console.ReadLine( ); Console.Clear( ); break;

Programacin IV. Gua 8

case 3: Console.Write("Teclee el Dato a Buscar: "); Dato = int.Parse(Console.ReadLine( )); if (Raiz != null) { BuscarNodo(Raiz, Dato); } else { Console.WriteLine("ERROR, Arbol Vacio...."); } Console.Clear( ); break; case 4: Console.Write("Teclee el Dato a Eliminar: "); Dato = int.Parse(Console.ReadLine( )); if (Raiz != null) { EliminarNodo(ref Raiz, Dato); } else { Console.WriteLine("ERROR, Arbol Vacio...."); } Console.Clear( ); break; case 5: Finalizar( ); break; default: Console.WriteLine("ERROR, Opcion Invalida...."); Console.ReadLine( ); Console.WriteLine(""); break; } } while (Opcion != 5); } static int Menu( ) { int Resultado = 0; Console.WriteLine("MENU DE ARBOLES"); Console.WriteLine(""); Console.WriteLine("1.- Registrar un Nuevo Nodo"); Console.WriteLine("2.- Mostrar/Recorrer el Arbol"); Console.WriteLine("3.- Buscar un Nodo"); Console.WriteLine("4.- Eliminar un Nodo"); Console.WriteLine("5.- Finalizar el Programa"); Console.WriteLine(""); Console.Write("Opcion: "); Resultado = int.Parse(Console.ReadLine());

6 Programacin IV, Gua 8

Console.WriteLine(""); return Resultado; } //Insertar en un arbol binario static void Insertar(NodoT Raiz, int Dato) { if (Dato < Raiz.Informacion) { if (Raiz.NodoIzquierdo == null) { NodoT NuevoNodo = new NodoT( ); NuevoNodo.Informacion = Dato; Raiz.NodoIzquierdo = NuevoNodo; } else { Insertar(Raiz.NodoIzquierdo, Dato); //Llamada recursiva } } else { //Buscar por el lado derecho if (Dato > Raiz.Informacion) { if (Raiz.NodoDerecho == null) { NodoT NuevoNodo = new NodoT( ); NuevoNodo.Informacion = Dato; Raiz.NodoDerecho = NuevoNodo; } else { //Llamada recursiva por el lado derecho Insertar(Raiz.NodoDerecho, Dato); } } else { //El Nodo existe en el Arbol Console.WriteLine("Nodo Existente, Imposible Insertar..."); Console.ReadLine( ); } } } //Metodo de recorrido static void BuscarNodo(NodoT Raiz, int Dato) { if (Dato < Raiz.Informacion) { if (Raiz.NodoIzquierdo == null) //Buscar por el Sub-Arbol izquierdo { Console.WriteLine("ERROR, No se encuentra el Nodo..."); Console.ReadLine( ); } else { BuscarNodo(Raiz.NodoIzquierdo, Dato); } } else {

Programacin IV. Gua 8

if (Dato > Raiz.Informacion) { if (Raiz.NodoDerecho == null) //Buscar por el Sub-Arbol derecho { Console.WriteLine("ERROR, No se encuentra el Nodo..."); Console.ReadLine( ); } else { BuscarNodo(Raiz.NodoDerecho, Dato); } } else { //El nodo se encontro Console.WriteLine("Nodo Localizado en el Arbol..."); Console.ReadLine( ); } } } //Metodo de Eliminar static void EliminarNodo(ref NodoT Raiz, int Dato) { if (Raiz != null) { if (Dato < Raiz.Informacion) { EliminarNodo(ref Raiz.NodoIzquierdo, Dato); } else { if (Dato > Raiz.Informacion) { EliminarNodo(ref Raiz.NodoDerecho, Dato); } else { NodoT NodoEliminar = Raiz; //Si lo Encontro if (NodoEliminar.NodoDerecho == null) { Raiz = NodoEliminar.NodoIzquierdo; } else { if (NodoEliminar.NodoIzquierdo == null) { Raiz = NodoEliminar.NodoDerecho; } else { NodoT AuxiliarNodo = null; NodoT Auxiliar = Raiz.NodoIzquierdo; bool Bandera = false; while (Auxiliar.NodoDerecho != null) { AuxiliarNodo = Auxiliar; Auxiliar = Auxiliar.NodoDerecho; Bandera = true; } Raiz.Informacion = Auxiliar.Informacion; NodoEliminar = Auxiliar; 4. Ejecutar el proyecto y ver sus resultados. if (Bandera == true) { AuxiliarNodo.NodoDerecho = Auxiliar.NodoIzquierdo; }

8 Programacin IV, Gua 8

else { } } } } }

Raiz.NodoIzquierdo = Auxiliar.NodoIzquierdo;

} else { Console.WriteLine("ERROR, EL Nodo no se Encuentra en el Arbol..."); Console.ReadLine( ); } } //Metodo de Finalizacion static void Finalizar( ) { Console.WriteLine("Fin del Programa, press any key to continue,..."); Console.ReadLine( ); } } } // Fin de Program // Fin del namespace

Anlisis de resultados
1. A partir del cdigo anterior, desarrolle el mtodo Mostrar/Recorrer el rbol usando el recorrido en orden. El algoritmo es el siguiente: void enOrden(ArbolBinario raz) { if(raiz) { enOrden(raiz>izq) visitar(raiz>dato) enOrden(raiz>der) } } 2. Desarrolle una interfaz grfica para el manejo del arbol binario de bsqueda.

Programacin IV. Gua 8

Investigacin Complementaria

Para la siguiente semana: Implementar en entorno grfico el manejo de rboles genricos, es decir, aquellos que los nodos tengan la posibilidad de referenciar a ms de dos nodos hijo:

10 Programacin IV, Gua 8

Gua 8: Arboles en C#.


Alumno: Docente:

Hoja de cotejo:

Mquina No: GL: Fecha:

EVALUACIN % CONOCIMIENTO Del 20 al 30% 1-4 Conocimiento deficiente de los fundamentos tericos 5-7 Conocimiento y explicacin incompleta de los fundamentos tericos 8-10 Conocimiento completo y explicacin clara de los fundamentos tericos Nota

APLICACIN DEL CONOCIMIENTO

Del 40% al 60%

ACTITUD

Del 15% al 30%

No tiene actitud proactiva.

Actitud propositiva y con propuestas no aplicables al contenido de la gua.

Tiene actitud proactiva y sus propuestas son concretas.

TOTAL

100%

You might also like