You are on page 1of 9

1 Programación 4, Guía 8

Facultad: Ingeniería
Escuela: Computación
Asignatura: Programación 4

Tema: ARBOLES CON C#

Objetivo Especifico

• Conocer la definición de Arboles


• A partir de una clase agregar sintaxis necesaria para construir un árbol

Introduccion Teorica

A. Definición
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 raíz tiene 0 relaciones se llama hoja.
2. Si el nodo raíz tiene 1 relación a la izquierda, el segundo elemento de la relación es el
subárbol izquierdo.
3. Si el nodo raíz tiene 1 relación a la derecha, el segundo elemento de la relación es el
subárbol derecho.

Figura 1: Un árbol binario sencillo de


tamaño 9 y altura 3,con un nodo raíz
cuyo valor es 2
Programación 4, Guía 8 2

Figura 2: Árbol binario esencialmente


completo

B. Existen cuatro tipos de árbol binario:


1. A. B. Distinto.
2. A. B. Similares.
3. A. B. Equivalentes.
4. A. B. Completos.

A continuación se hará una breve descripción de los diferentes tipos de árbol binario así como
un ejemplo de cada uno de ellos.

A. B. DISTINTO
Se dice que dos árboles binarios son distintos cuando sus estructuras son
diferentes. Ejemplo:

A A

B
B

A. B. SIMILARES
Dos árboles binarios son similares cuando sus estructuras son idénticas, pero la
información que contienen sus nodos es diferente. Ejemplo:

A A

B D

A. B. EQUIVALENTES
Son aquellos arboles que son similares y que además los nodos contienen la misma
información. Ejemplo:

A A

B B
3 Programación 4, Guía 8

A. B. COMPLETOS
Son aquellos arboles en los que todos sus nodos excepto los del último nivel, tiene dos hijos;
el subárbol izquierdo y el subárbol derecho.

Los nodos del árbol binario serán representados como registros que contendrán como mínimo
tres campos. En un campo se almacenará la información del nodo. Los dos restantes se
utilizarán para apuntar al subárbol izquierdo y derecho del subárbol en cuestión.

Cada nodo se representa gráficamente de la siguiente manera:

Izquierdo Centro Derecho


Programación 4, Guía 8 4

Material y Equipo

• Guía de laboratorio No. 8


• Visual Studio 2005

Procedimiento

Ejemplo: Árbol binario de búsqueda


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;
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: ");
5 Programación 4, Guía 8

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{//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
Programación 4, Guía 8 6

static void Recorrer(NodoT Raiz){


Console.WriteLine("No existe ningun metodo para esta opcion...");
Console.Read();
}
//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{
//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;
}
7 Programación 4, Guía 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();
}
}
}
Programación 4, Guía 8 8

Ejercicios

1. A partir del código anterior, desarrolle el método “Mostrar/Recorrer el Árbol” usando


uno de los siguientes recorridos:
◦ inorder
◦ preorder
◦ postorder

2. Desarrolle una interfaz gráfica para el manejo del arbol binario de búsqueda.

Tarea

• Modificar el código de la guía para el manejo de arboles generales, osea que los nodos
tengan la posibilidad de referenciar a mas de dos nodos hijo:
9 Programación 4, Guía 8

Hoja de cotejo: 8

Guía 8: ARBOLES CON C#


Alumno: Maquina No:

Docente: GL: Fecha:

EVALUACION

% 1-4 5-7 8-10 Nota

CONOCIMIENTO Del Conocimiento Conocimiento Conocimiento


20 deficiente de y explicación completo y
al los incompleta de explicación
30% fundamentos los clara de los
teóricos fundamentos fundamentos
teóricos teóricos

APLICACIÓN Del
DEL 40%
CONOCIMIENTO al
60%

ACTITUD
Del No tiene Actitud Tiene actitud
15% actitud propositiva y proactiva y
al proactiva. con sus
30% propuestas no propuestas
aplicables al son
contenido de concretas.
la guía.

TOTAL 100%