using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _2024._12._05
{
    internal class Binfa
    {
        public Csomopont Gyoker { get; private set; }
        public void Beszuras(int adat)
        {
            Gyoker = BeszurasRekurziv(Gyoker, adat);
        }

        private Csomopont BeszurasRekurziv(Csomopont csomopont, int adat)
        {
            if (csomopont == null)
            {
                return new Csomopont(adat);
            }

            if (adat < csomopont.Adat)
            {
                csomopont.Bal = BeszurasRekurziv(csomopont.Bal, adat);
            }

            else if (adat > csomopont.Adat)
            {
                csomopont.Jobb = BeszurasRekurziv(csomopont.Jobb, adat);
            }

            return csomopont;
        }

        public bool Kereses(int adat)
        {
            return KeresesRekurziv(Gyoker, adat);
        }

        public bool KeresesRekurziv(Csomopont csomopont, int adat)
        {
            if (csomopont == null)
            {
                return false;
            }

            if (adat == csomopont.Adat)
            {
                return true;
            }

            return csomopont < csomopont.Adat
                ? KeresesRekurziv(csomopont.Bal, adat)
                : KeresesRekurziv(csomopont.Jobb, adat);
        }

        private Csomopont TorlesRekurziv(Csomopont csomopont, int adat)
        {
            if (csomopont == null)
            {
                return null;
            }

            if (adat < csomopont.Adat)
            {
                csomopont.Bal = TorlesRekurziv(csomopont.Bal, adat);
            }

            else if (adat > csomopont.Adat)
            {
                csomopont.Jobb = TorlesRekurziv(csomopont.Jobb, adat);
            }

            else
            {
                if (csomopont.Bal == null && csomopont.Jobb == null)
                {
                    return null;
                }

                if (csomopont.Bal == null)
                {
                    return csomopont.Jobb;
                }

                if (csomopont.Jobb == null)
                {
                    return csomopont.Bal;
                }

                csomopont.Adat = MinimumErtek(csomopont.Jobb);
                csomopont.Jobb = TorlesRekurziv(csomopont.Jobb, csomopont.Adat);
            }

            return csomopont;
        }

        private int MinimumErtek(Csomopont csomopont)
        {
            while (csomopont.Bal != null)
            {
                csomopont = csomopont.Bal;
            }

            return csomopont.Adat;
        }

        public void InorderBejaras()
        {
            Console.WriteLine("Inorder bejárás:");
            InorderRekurziv(Gyoker);
            Console.WriteLine();
        }

        private void InorderRekurziv(Csomopont csomopont)
        {
            if (csomopont == null) return;
            InorderRekurziv(csomopont.Bal);
            Console.Write($"{csomopont.Adat} ");
            InorderRekurziv(csomopont.Jobb);
        }
    }
}
