using System;
using System.Collections.Generic;
using System.Linq;
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("EROR, 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("EROR, Arbol Vacio...");
}
Console.Clear();
break;
case 5:
Finalizar();
break;
case 6:
RecorrerPreOrden(Raiz);
Console.WriteLine("Fin del Recorrido,...");
Console.ReadLine();
Console.Clear();
break;
default:
Console.WriteLine("ERROR, Opción 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("6. - Recorrido pre-orden");
Console.WriteLine("3. - Buscar un Nodo");
Console.WriteLine("4. - Eliminar un Nodo");
Console.WriteLine("5. - Finalizar programa");
Console.WriteLine("");
Console.WriteLine("Opcion: ");
Resultado = int.Parse(Console.ReadLine());
Console.WriteLine("");
return Resultado;
}
//Insertar 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
{
if (Dato > Raiz.Informacion)
{ if(Raiz.NodoDerecho == null)
{
NodoT NuevoNodo
= new NodoT
(); NuevoNodo.Informacion = Dato;
Raiz.NodoDerecho =NuevoNodo;
}
else
{
//Llamada recursiva por lado derecho
Insertar(Raiz.NodoDerecho, Dato);
}
}
else
{
//El nodo no 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 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 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;
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 Finailizacion
static void Finalizar()
{
Console.WriteLine("Fin del programa, presiona cualquier tecla para continuar...");
Console.ReadLine();
}
//
static void Recorrer(NodoT Raiz)
{
if (Raiz != null)
{
Recorrer(Raiz.NodoIzquierdo);
Console.Write("{0}, ", Raiz.Informacion);
Recorrer(Raiz.NodoDerecho);
}
}
//Recorrido preorden
static void RecorrerPreOrden(NodoT Raiz)
{
if (Raiz != null)
{
Console.Write("{0}, ", Raiz.Informacion);
RecorrerPreOrden(Raiz.NodoIzquierdo);
RecorrerPreOrden(Raiz.NodoDerecho);
}
}
}//fin program
}//fin namespace