Está en la página 1de 11

Programacin III, Gua 7

Facultad : Ingeniera Escuela : Computacin Asignatura: Programacin III

Tema: ARBOLES BINARIOS.

Objetivo
Implemente la estructura de datos arboles utilizando C#. NET. Conozca los recorridos ms comunes en los rboles.

Introduccin
En ciencias de la computacin, un rbol binario es una estructura de datos en la cual cada nodo siempre tiene un hijo izquierdo y un hijo derecho. No pueden tener ms de dos hijos (de ah el nombre Binario). Si algn hijo tiene como referencia a null, es decir que no almacena ningn dato, entonces este es llamado un nodo externo. En el caso contrario el hijo es llamado un nodo interno.

Terminologa:
Nodo: Cada elemento en un rbol. Nodo Raz: Primer elemento agregado al rbol.

Nodo Padre: Se le llama as al nodo predecesor de un elemento.

Programacin III, Gua 7 2 Nodo Hijo: Es el nodo sucesor de un elemento. Nodo Hermano: Nodos que tienen el mismo nodo padre.

Nodo Hoja: Aquel nodo que no tiene hijos.

Subrbol: Todos los nodos descendientes por la izquierda o derecha de un nodo.

Altura y Niveles: La altura es la cantidad de niveles.

Programacin III, Gua 7

Recorrido del rbol:


Recorrer el rbol significa que cada nodo sea procesado una vez en una secuencia determinada. Existen dos enfoques generales: Recorrido en Profundidad: El proceso exigen alcanzar las profundidades de un camino desde la raz hacia el descendiente ms lejano del primer hijo, antes de proseguir con el segundo. Recorrido en Anchura: El proceso se realiza horizontalmente desde la raz a todos sus hijos antes de pasar con la descendencia de algunos de ellos.

Algoritmos:

Recorrido PreOrden(RID)
void preOrden(ArbolBinario raz) { if(raiz) { visitar(raiz>dato) preOrden(raiz>izq) preOrden(raiz>der) } } El recorrido en PreOrden del rbol es el siguiente: 15, 6, 4, 10, 20, 17, 22

Programacin III, Gua 7 4

Recorrido EnOrden (IRD)


void enOrden(ArbolBinario raz) { if(raiz) { enOrden(raiz>izq) visitar(raiz>dato) enOrden(raiz>der) } } El recorrido en EnOrden del rbol es el siguiente: 4, 6, 10, 15, 17, 20, 22

Recorrido PostOrden (IDR)


void PostOrden(ArbolBinario raz) { if(raiz) { PostOrden(raiz>izq) PostOrden(raiz>der) visitar(raiz>dato) } } El recorrido en PostOrden del rbol es el siguiente: 4, 10, 6, 17, 22, 20, 15

Materiales y equipo
Gua de Laboratorio N 7. Computadora con programa: o Visual Studio 2005. C# Dispositivo de Almacenamiento (USB).

Programacin III, Gua 7

Procedimiento
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; //Recorrido en Pre Orden del Arbol case 2: RecorridoPreorden(Raiz); Console.WriteLine("Fin del Recorrido,..."); Console.ReadLine(); Console.Clear(); break; //Recorrido en Post Orden del Arbol case 3: RecorridoPostorden(Raiz); Console.WriteLine("Fin del Recorrido,..."); Console.ReadLine(); Console.Clear(); break; //Recorrido en In Orden del Arbol

Programacin III, Gua 7 6


case 4: RecorridoInorden(Raiz); Console.WriteLine("Fin del Recorrido,..."); Console.ReadLine(); Console.Clear(); break; case 5: 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 6: 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 7: Finalizar(); break; } } while (Opcion != 7);

} static int Menu() { int Resultado = 0; do { Console.WriteLine("MENU DE ARBOLES"); Console.WriteLine(""); Console.WriteLine("1.- Registrar un Nuevo Nodo"); Console.WriteLine("2.- Recorrido en Pre-orden"); Console.WriteLine("3.- Recorrido en Post-orden"); Console.WriteLine("4.- Recorrido en In-orden"); Console.WriteLine("5.- Buscar un Nodo"); Console.WriteLine("6.- Eliminar un Nodo"); Console.WriteLine("7.- Finalizar el Programa"); Console.WriteLine(""); Console.Write("Teclee la Opcion Deseada: "); Resultado = int.Parse(Console.ReadLine()); Console.WriteLine(""); if (Resultado < 1 || Resultado > 7) { Console.WriteLine("ERROR, Opcion Invalida...."); Console.ReadLine(); Console.WriteLine(""); } Console.Clear(); } while (Resultado < 1 || Resultado > 7);

Programacin III, Gua 7


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 { //Llamada recursiva Insertar(Raiz.NodoIzquierdo, Dato); } } 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 en Pre-Orden static void RecorridoPreorden(NodoT Raiz) { if (Raiz != null) { Console.Write("{0}, ", Raiz.Informacion); RecorridoPreorden(Raiz.NodoIzquierdo); RecorridoPreorden(Raiz.NodoDerecho); } } //Metodo de recorrido en In-Orden static void RecorridoInorden(NodoT Raiz) { Console.WriteLine("No existe ningun metodo para esta opcion..."); Console.Read(); } //Metodo de recorrido en Post-Orden static void RecorridoPostorden(NodoT Raiz) {

Programacin III, Gua 7 8


if (Raiz != null) { RecorridoPostorden(Raiz.NodoIzquierdo); RecorridoPostorden(Raiz.NodoDerecho); Console.Write("{0}, ", Raiz.Informacion); } } //Metodo de Buscar un nodo static void BuscarNodo(NodoT Raiz, int Dato) { if (Dato < Raiz.Informacion) { //Buscar por el Sub-Arbol izquierdo if (Raiz.NodoIzquierdo == null) { Console.WriteLine("ERROR, No se encuentra el Nodo..."); Console.ReadLine(); } else { BuscarNodo(Raiz.NodoIzquierdo, Dato); } } else { if (Dato > Raiz.Informacion) { //Buscar por el Sub-Arbol derecho if (Raiz.NodoDerecho == null) { 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 {

Programacin III, Gua 7


//Si lo Encontro NodoT NodoEliminar = Raiz; 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; 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(); } } }

Programacin III, Gua 7 10

Anlisis de resultados
Crear un mtodo al ejercicio anterior, que realice el recorrido en INORDEN

Investigacin complementaria.
Como determinar la altura del rbol. Como determinar la profundidad de un nodo Como determinar el nmero de nodos en cualquier momento.

NOTA: Todo esto aplicarlo al ejercicio de la prctica.

Bibliografa.
DEITEL, HARVEY M. / DEITEL, PAUL J. Cmo programar en C#. Editorial Pearson Prentice Hall, Mxico 2004.

http://www.ucema.edu.ar/~rst/Algoritmos_y_Estructura_de_Datos/Teoria/5._Arboles_binar ios.pdf

Programacin III, Gua 7

11

Hoja de cotejo:

7 1

Gua 7: rboles Binarios.

Alumno: Docente:

Mquina No: GL: Fecha:

EVALUACION % 1-4 5-7 8-10 Nota

CONOCIMIENTO

40

APLICACIN DEL CONOCIMIENTO

40

ACTITUD 20

TOTAL 100%

También podría gustarte