Professional Documents
Culture Documents
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.
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.
Procedimiento
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());
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 {
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; }
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.
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:
Hoja de cotejo:
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
ACTITUD
TOTAL
100%