// UjZeneFeltoltes metódusban megtalálható
        public void UjZeneFeltoltes(t adatok, int kulcs) // új zene fetöltése
        {
            int meret_0 = 0;


            Beszuras(ref gyoker, adatok, kulcs);
            uj_szam_feltoltes_kiiras(); // esemény elsütés
            MemoriaKartyaMeret(gyoker, ref meret_0);


            if (meret_0 > meret) // megvizsgáljuk ,hogy a lejátszó mérete kisebb -e a memoriakártya méreténél, ha nem akkor törlés
            {
                while (!(meret_0 < meret))
                {
                    binaris_fa legalacsonyabbElem = LegalacsonyabbErtekeles(gyoker);
                    Torles_fajtak(ref gyoker, legalacsonyabbElem.ertekeles);
                    meret_0 -= legalacsonyabbElem.adatok[0].tarhely;
                    if (legalacsonyabbElem.adatok.Count > 1)
                    {
                        for (int i = 0; i < legalacsonyabbElem.adatok.Count; i++)
                        {
                            regi_szamok_torlese_kiiras?.Invoke();
                        }
                    }
                    else
                    {
                        regi_szamok_torlese_kiiras?.Invoke();
                    }
                }
            }
        }
 public void MemoriaKartyaMeret(binaris_fa p, ref int meret_osszes) // postorder bejaras, az órán tanultak szerint, megnézzük ,hogy mekkora a memoria mérete.
 {
     if (p != null)
     {
         MemoriaKartyaMeret(p.balelem, ref meret_osszes);
         MemoriaKartyaMeret(p.jobbelem, ref meret_osszes);
         meret_osszes += p.Tarhely;
     }
 }
 void Kiiras_privat(ref binaris_fa p) //postorder
 {
     if (p != null)
     {
         Kiiras_privat(ref p.balelem);
         Kiiras_privat(ref p.jobbelem);
         Console.WriteLine(p.ToString());
     }
 }
 //MegmaradtUresElemekTorlesében találtaho
 public void KetGyermekTorlese(ref binaris_fa e, ref binaris_fa r)
 {
     if (r.jobbelem != null)
     {
         KetGyermekTorlese(ref e, ref r.jobbelem);
     }
     else
     {
         e.adatok    = r.adatok;
         e.ertekeles = r.ertekeles;
         r           = r.balelem;
     }
 }
        //UjZeneFeltoltes metódusban megtalálható



        public void Torles_fajtak(ref binaris_fa p, int kulcs) // órán vett anyag (elemek törlése a bináris fában)
        {
            // az "e" elem törlését végzi el a "p" gyökerű részfában
            if (p != null)
            {
                if (p.ertekeles.Equals(kulcs))
                {
                    // megvan a törlendő elem
                    if (p.balelem == null && p.jobbelem == null)
                    {
                        // 0 gyermek (levél)
                        p = null;
                    }
                    else if (p.balelem == null && p.jobbelem != null)
                    {
                        // 1 gyermek (jobb)
                        p = p.jobbelem;
                    }
                    else if (p.jobbelem == null && p.balelem != null)
                    {
                        // 1 gyermek (bal)
                        p = p.balelem;
                    }
                    else if (p.balelem != null && p.jobbelem != null)
                    {
                        // 2 gyermek (bal és jobb)
                        KetGyermekTorlese(ref p, ref p.balelem);
                    }
                }
                else if (p.ertekeles < kulcs)
                {
                    Torles_fajtak(ref p.jobbelem, kulcs);
                }
                else
                {
                    Torles_fajtak(ref p.balelem, kulcs);
                }
            }
            else
            {
                throw new Exception("Nincs ilyen elem törlésnél.");
            }
        }
 public void Beszuras(ref binaris_fa p, t tartalom, int kulcs) // A beszúrja a bináris fába az adatokat
 {
     if (p == null)                                            // megvizsgáljuk, hogy nem null az érték, ha igen akkor létrehozunk 1 újat
     {
         p = new binaris_fa(tartalom, kulcs);
     }
     else if (kulcs > p.ertekeles) // pszeudokód szerint beszúrunk
     {
         Beszuras(ref p.jobbelem, tartalom, kulcs);
     }
     else if (kulcs < p.ertekeles) // pszeudokód szerint beszúrunk
     {
         Beszuras(ref p.balelem, tartalom, kulcs);
     }
     else
     {
         foreach (t elem in p.adatok) // Megvizsgaljuk ,hogy létezik -e ez a zene már, és ha igen akkor  MarVanIlyenZeneException -t dobunk
         {
             if ((tartalom is konnyuzene) && (elem is konnyuzene))
             {
                 if ((elem as konnyuzene).Cim == (tartalom as konnyuzene).Cim && ((elem as konnyuzene).Eloado == (tartalom as konnyuzene).Eloado))
                 {
                     throw new MarVanIlyenZeneException();
                 }
             }
             else if ((tartalom is komolyzene) && (elem is komolyzene))
             {
                 if ((elem as komolyzene).Cim == (tartalom as komolyzene).Cim && ((elem as komolyzene).Zeneszero == (tartalom as komolyzene).Zeneszero))
                 {
                     throw new MarVanIlyenZeneException();
                 }
             }
             else if ((tartalom is sajatzene) && (elem is sajatzene))
             {
                 if ((elem as sajatzene).tarhely == (tartalom as sajatzene).tarhely && ((elem as sajatzene).idotartam == (tartalom as sajatzene).idotartam))
                 {
                     throw new MarVanIlyenZeneException();
                 }
             }
         }
         p.adatok.Add(tartalom); // ADDoljuk a listahoz
     }
 }
        //UjZeneFeltoltes metódusban megtalálható
        public binaris_fa  LegalacsonyabbErtekeles(binaris_fa p) // ha nem fér el a szám, akkor a legalacsonyabban értékelt számokat töröljük .v
        {
            if (p != null)
            {
                binaris_fa minelem = p;

                if (p.balelem != null && p.ertekeles < p.balelem.ertekeles)
                {
                    return(minelem = LegalacsonyabbErtekeles(p.balelem));
                }
                else
                {
                    return(minelem);
                }
            }
            else
            {
                throw new Exception();
            }
        }
        public void lejatszas(binaris_fa p, ref lejatszo <t> lejatszas_0)
        {
            string beirt           = "";  // amiben leírja a felhasználó  hogy tetszett e neki, e vagy sem a zene
            int    beirt_ertekeles = 0;   // amiben értékel a felhasználó
                                          // do while azért kell ,mert ha mellé ütünk ne legyen hiba
            bool igaz_e          = false; // külső do while ha a beirt adat i vagy n akkor kilép a do whileból
            bool igaz_e2         = false; // belső do while ha a beírt adattal nem lesz több vag kevesebb az értékelés mint 5 kilép a do whileból
            int  elozo_ertekeles = 0;     // kell mert szeretnék a hallgatók ,hogy kiírjam nekik a jelenlegi értékelést ,hogy tudják azt ,hogy mennyit lehet változtatni rajta

            if (p != null)
            {
                lejatszas(p.balelem, ref lejatszas_0);
                lejatszas(p.jobbelem, ref lejatszas_0);
                for (int i = 0; i < p.adatok.Count; i++) //a listát átpörgetjük és csak a végéig megyünk
                {
                    t adat = p.adatok[i];                //a mostani adatokat lementjük , hogy a metódus végén felhasználjuk
                    elozo_ertekeles = adat.ertekeles;    // kell hogy kitudjuk iratni az eredeti értéket
                    do
                    {
                        Console.WriteLine("Az " + (i + 1) + ". zeneszám lejátszódott. Hogy tetszett? // (i) - igen tetszett ! , (n) - nem tetszett");
                        beirt = Console.ReadLine();
                        Console.Clear();



                        if (beirt == "i")
                        {
                            igaz_e = true;
                            do
                            {
                                Console.WriteLine("Látom tetszett a zene");
                                Console.WriteLine("Eredeti értékelés: {0}", elozo_ertekeles);
                                Console.WriteLine("Mennyivel szeretnéd növelni az értékelést ? ");
                                beirt_ertekeles = Convert.ToInt32(Console.ReadLine());
                                Console.Clear();


                                if (adat.ertekeles + beirt_ertekeles <= 5)
                                {
                                    igaz_e2 = true;
                                }
                                else
                                {
                                    igaz_e2 = false;

                                    Console.WriteLine("Az értékelésed meghaladja az 5-ös (maximum értéket)! jelenlegi értékelés : {0}", adat.ertekeles);
                                    Console.WriteLine("Nyomj egy ENTER -t az újrapróbálkozáshoz");
                                    Console.ReadLine();
                                    Console.Clear();
                                }
                            } while (igaz_e2 != true);
                            adat.ertekeles = adat.ertekeles + beirt_ertekeles; // ha megfelelt ,akkor hozzáadjuk az értékelést
                        }
                        else if (beirt == "n")
                        {
                            igaz_e = true;
                            do
                            {
                                Console.WriteLine("Látom nem tetszett a zene");
                                Console.WriteLine("Eredeti értékelés: {0}", elozo_ertekeles);
                                Console.WriteLine("Mennyivel szeretnéd csökkenteni az értékelést ? ");

                                beirt_ertekeles = Convert.ToInt32(Console.ReadLine());
                                Console.Clear();


                                if (adat.ertekeles - beirt_ertekeles > 0)
                                {
                                    igaz_e2 = true;
                                }
                                else
                                {
                                    igaz_e2 = false;

                                    Console.WriteLine("Az értékelésed nem éri el a 0-ás (minimum értéket)! jelenlegi értékelés : {0}", adat.ertekeles);
                                    Console.WriteLine("Nyomj egy ENTER -t az újrapróbálkozáshoz");
                                    Console.ReadLine();
                                    Console.Clear();
                                }
                            } while (igaz_e2 != true);

                            adat.ertekeles = adat.ertekeles - beirt_ertekeles; // ha megfelelt kivonjuk
                        }
                        else
                        {
                            igaz_e = false;

                            Console.WriteLine("Nem jó gombot ütöttél le, lehet csak megcsúszott a kezed :). A beirt adatod {0} ", beirt);
                            Console.WriteLine("Kérlek az ENTER-gomb lenyomása után próbáld újra !");
                            Console.ReadLine();
                            Console.Clear();
                        }
                    } while (igaz_e != true);


                    Console.WriteLine("Szuper, az értékelés megváltozott! (kivéve ha 0-át írtál be, te kis sunyi :) )");
                    Console.WriteLine("Eredeti értékelés: {0}", elozo_ertekeles);
                    Console.WriteLine("Új értékelés: {0}", adat.ertekeles);
                    Console.WriteLine("Az ENTER lenyomásával tovább léphetsz");
                    ertekeles_valtozas_kiiras?.Invoke(); // esemény elsütés
                    Console.ReadLine();
                    Console.Clear();
                    lejatszaskiiras?.Invoke(); // esemény elsütés
                }
            }
        } // itt történik az zenék meghallgatása és értékelése