• WORD
  • FORMATO AUTOMATICO Y ESTILOS
  • INSERTAR CUADRO DE TEXTO Y ECUACION
  • REFERENCIASTABLA DE CONTENIDO Y BIBLIOGRAFIA
  • Ir a Prácticas
  • EXCEL
  • FORMULAS I y II
  • TABLAS Y GRAFICOS DINAMICOS
  • SUBTOTALES Y BASE DE DATOS
  • MACROS
  • Ir a Prácticas
  • AUTOCAD
  • 2D:DIBUJO Y ACOTAR
  • INSERTAR BLOQUES Y PLOT
  • 3D: MODELADO Y EDICION DE SOLIDOS
  • RENDER Y ANIMACIONES
  • Ir a Prácticas

viernes, 13 de marzo de 2026

C# : ARBOLES BINARIOS

ARBOLES BINARIOS

Los árboles binarios en C# son estructuras de datos jerárquicas donde cada nodo tiene, como máximo, dos hijos: izquierdo y derecho. Son fundamentales para organizar información de forma no secuencial y optimizar procesos de búsqueda y ordenamiento.





CODIGO:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

 

namespace ConsoleApplication9

{

    using System;

 

    // Clase Nodo del árbol

    public class Nodo

    {

        public int valor;

        public Nodo izquierdo;

 

 

 

        public Nodo derecho;

 

        public Nodo(int valor)

        {

            this.valor = valor;

            izquierdo = null;

            derecho = null;

        }

    }

 

    // Clase principal del Árbol Binario de Búsqueda

    public class ArbolBinarioBusqueda

    {

        private Nodo raiz;

 

        public ArbolBinarioBusqueda()

        {

            raiz = null;

        }

 

        // Insertar un nuevo valor

        public void Insertar(int valor)

        {

            raiz = InsertarRec(raiz, valor);

        }

 

        private Nodo InsertarRec(Nodo raiz, int valor)

        {

            // Si el nodo está vacío, crear nuevo nodo

            if (raiz == null)

            {

                raiz = new Nodo(valor);

                return raiz;

            }

 

            // Ir a la izquierda si el valor es menor

            if (valor < raiz.valor)

                raiz.izquierdo = InsertarRec(raiz.izquierdo, valor);

            // Ir a la derecha si el valor es mayor

            else if (valor > raiz.valor)

                raiz.derecho = InsertarRec(raiz.derecho, valor);

 

            return raiz;

        }

 

        // Buscar un valor en el árbol

        public bool Buscar(int valor)

        {

            return BuscarRec(raiz, valor);

        }

 

        private bool BuscarRec(Nodo raiz, int valor)

        {

            // Árbol vacío o valor encontrado

            if (raiz == null || raiz.valor == valor)

                return raiz != null;

 

            // Buscar en subárbol izquierdo si valor es menor

            if (valor < raiz.valor)

                return BuscarRec(raiz.izquierdo, valor);

 

            // Buscar en subárbol derecho si valor es mayor

            return BuscarRec(raiz.derecho, valor);

        }

 

        // Eliminar un nodo

        public void Eliminar(int valor)

        {

            raiz = EliminarRec(raiz, valor);

        }

 

        private Nodo EliminarRec(Nodo raiz, int valor)

        {

            if (raiz == null) return raiz;

 

            if (valor < raiz.valor)

                raiz.izquierdo = EliminarRec(raiz.izquierdo, valor);

            else if (valor > raiz.valor)

                raiz.derecho = EliminarRec(raiz.derecho, valor);

            else

            {

                // Nodo con un solo hijo o sin hijos

                if (raiz.izquierdo == null)

                    return raiz.derecho;

                else if (raiz.derecho == null)

                    return raiz.izquierdo;

 

                // Nodo con dos hijos: obtener el inorder successor

                raiz.valor = MinimoValor(raiz.derecho);

 

                // Eliminar el inorder successor

                raiz.derecho = EliminarRec(raiz.derecho, raiz.valor);

            }

            return raiz;

        }

 

        private int MinimoValor(Nodo raiz)

        {

            int minimo = raiz.valor;

            while (raiz.izquierdo != null)

            {

                minimo = raiz.izquierdo.valor;

                raiz = raiz.izquierdo;

            }

            return minimo;

        }

 

        // Recorrido Inorden (izquierda-raíz-derecha)

        public void Inorden()

        {

            InordenRec(raiz);

            Console.WriteLine();

        }

 

        private void InordenRec(Nodo raiz)

        {

            if (raiz != null)

            {

                InordenRec(raiz.izquierdo);

                Console.Write(raiz.valor + " ");

                InordenRec(raiz.derecho);

            }

        }

 

        // Recorrido Preorden (raíz-izquierda-derecha)

        public void Preorden()

        {

            PreordenRec(raiz);

            Console.WriteLine();

        }

 

        private void PreordenRec(Nodo raiz)

        {

            if (raiz != null)  

            {

                Console.Write(raiz.valor + " ");

                PreordenRec(raiz.izquierdo);

                PreordenRec(raiz.derecho);

            }

        }

 

        // Recorrido Postorden (izquierda-derecha-raíz)

        public void Postorden()

        {

            PostordenRec(raiz);

            Console.WriteLine();

        }

 

        private void PostordenRec(Nodo raiz)

        {

            if (raiz != null)

            {

                PostordenRec(raiz.izquierdo);

                PostordenRec(raiz.derecho);

                Console.Write(raiz.valor + " ");

            }

        }

 

        // Altura del árbol

        public int Altura()

        {

            return AlturaRec(raiz);

        }

 

        private int AlturaRec(Nodo raiz)

        {

            if (raiz == null)

                return -1;

            return 1 + Math.Max(AlturaRec(raiz.izquierdo), AlturaRec(raiz.derecho));

        }

 

        // Verificar si el árbol está vacío

        public bool EstaVacio()

        {

            return raiz == null;

        }

    }

 

    // Programa principal para probar el árbol

    class Program

    {

        static void Main(string[] args)

        {

            ArbolBinarioBusqueda arbol = new ArbolBinarioBusqueda();

 

            // Insertar valores

            int[] valores = { 50, 30, 70, 20, 40, 60, 80 };

            Console.WriteLine("Insertando valores: ");

            foreach (int val in valores)

            {

                arbol.Insertar(val);

                Console.Write(val + " ");

            }

            Console.WriteLine("\n");

 

            // Recorridos

            Console.WriteLine("=== RECORRIDOS ===");

            Console.Write("Inorden:  "); arbol.Inorden();

            Console.Write("Preorden: "); arbol.Preorden();

            Console.Write("Postorden:"); arbol.Postorden();

 

            // Búsquedas

            Console.WriteLine("\n=== BÚSQUEDAS ===");

            Console.WriteLine("Buscar 40: " + (arbol.Buscar(40) ? "ENCONTRADO" : "NO ENCONTRADO"));

            Console.WriteLine("Buscar 90: " + (arbol.Buscar(90) ? "ENCONTRADO" : "NO ENCONTRADO"));

 

            // Altura

            Console.WriteLine("\nAltura del árbol: " + arbol.Altura());

 

            // Eliminar nodo

            Console.WriteLine("\nEliminando nodo 20...");

            arbol.Eliminar(20);

            Console.Write("Nuevo Inorden: "); arbol.Inorden();

            Console.ReadKey(); // Pausa para ver resultados;

        }

      

    }

 

}

No hay comentarios.:

Publicar un comentario