Ejemplo n.º 1
0
        private Wyraz Szukaj(String s)
        {
            Wyraz aktualny = korzen;

            while (true)
            {
                if (aktualny.wyraz == s)
                {
                    return(aktualny);
                }
                else if (String.Compare(s, aktualny.wyraz) > 0)
                {
                    if (aktualny.prawy == null)
                    {
                        return(null);
                    }
                    else
                    {
                        aktualny = aktualny.prawy;
                    }
                }
                else if (String.Compare(s, aktualny.wyraz) < 0)
                {
                    if (aktualny.lewy == null)
                    {
                        return(null);
                    }
                    else
                    {
                        aktualny = aktualny.lewy;
                    }
                }
            }
        }
Ejemplo n.º 2
0
        private void RL(Wyraz rotowany)
        {
            int pom;

            if (rotowany.prawy.lewy == null)
            {
                pom = 0;
            }
            else
            {
                pom = rotowany.prawy.lewy.waga;
            }
            RR(rotowany.prawy);
            LL(rotowany);
            if (pom == 1)
            {
                rotowany.ojciec.waga       = 0;
                rotowany.waga              = 0;
                rotowany.ojciec.prawy.waga = -1;
            }
            else if (pom == 0)
            {
                rotowany.ojciec.waga       = 0;
                rotowany.waga              = 0;
                rotowany.ojciec.prawy.waga = 0;
            }
            if (pom == -1)
            {
                rotowany.ojciec.waga       = 0;
                rotowany.waga              = 1;
                rotowany.ojciec.prawy.waga = 0;
            }
        }
Ejemplo n.º 3
0
        private void LR(Wyraz rotowany)
        {
            int pom;

            if (rotowany.lewy.prawy == null)
            {
                pom = 0;
            }
            else
            {
                pom = rotowany.lewy.prawy.waga;
            }
            LL(rotowany.lewy);
            RR(rotowany);
            if (pom == -1)
            {
                rotowany.ojciec.waga      = 0; //c
                rotowany.waga             = 0; //a
                rotowany.ojciec.lewy.waga = 1; //b
            }
            else if (pom == 0)
            {
                rotowany.ojciec.waga      = 0;
                rotowany.waga             = 0;
                rotowany.ojciec.lewy.waga = 0;
            }
            else if (pom == 1)
            {
                rotowany.ojciec.waga      = 0;
                rotowany.waga             = -1;
                rotowany.ojciec.lewy.waga = 0;
            }
        }
Ejemplo n.º 4
0
 public void Wstaw(String s)
 {
     if (korzen == null)
     {
         korzen = new Wyraz(s);
     }
     else
     {
         Wyraz wstawiany = new Wyraz(s);
         Wyraz aktualny  = korzen;
         while (true)
         {
             if (wstawiany.wyraz == aktualny.wyraz)
             {
                 break;
             }
             if (aktualny.prawy == null && String.Compare(wstawiany.wyraz, aktualny.wyraz) > 0)
             {
                 aktualny.prawy   = wstawiany;
                 wstawiany.ojciec = aktualny;
                 aktualny.waga--;
                 wstawiany.waga = 0;
                 Balansuj(aktualny);
                 break;
             }
             else if (aktualny.lewy == null && String.Compare(wstawiany.wyraz, aktualny.wyraz) < 0)
             {
                 aktualny.lewy    = wstawiany;
                 wstawiany.ojciec = aktualny;
                 aktualny.waga++;
                 wstawiany.waga = 0;
                 Balansuj(aktualny);
                 break;
             }
             else if (String.Compare(wstawiany.wyraz, aktualny.wyraz) < 0)
             {
                 aktualny = aktualny.lewy;
             }
             else if (String.Compare(wstawiany.wyraz, aktualny.wyraz) > 0)
             {
                 aktualny = aktualny.prawy;
             }
         }
     }
 }
Ejemplo n.º 5
0
        private void LL(Wyraz rotowany)
        {
            if (rotowany.prawy.waga == -1)
            {
                rotowany.waga       = 0;
                rotowany.prawy.waga = 0;
            }
            else if (rotowany.prawy.waga == 0)
            {
                rotowany.waga       = -1;
                rotowany.prawy.waga = 1;
            }
            if (rotowany == korzen)
            {
                korzen = rotowany.prawy;
                rotowany.prawy.ojciec = null;
            }
            else
            {
                rotowany.prawy.ojciec = rotowany.ojciec;
                if (rotowany.ojciec?.prawy == rotowany)
                {
                    rotowany.ojciec.prawy = rotowany.prawy;
                }
                else
                {
                    rotowany.ojciec.lewy = rotowany.prawy;
                }
            }

            rotowany.ojciec = rotowany.prawy;
            Wyraz pom = rotowany.prawy;

            if (rotowany.prawy.lewy != null)
            {
                rotowany.prawy.lewy.ojciec = rotowany;
                rotowany.prawy             = rotowany.prawy.lewy;
            }
            else
            {
                rotowany.prawy = null;
            }
            pom.lewy = rotowany;
        }
Ejemplo n.º 6
0
 private void Balansuj(Wyraz pom)
 {
     if (pom == null)
     {
         return;
     }
     else if (pom.waga == 0)
     {
         return;
     }
     if (pom.waga == 1 || pom.waga == -1)
     {
         if (pom.ojciec != null)
         {
             if (pom.ojciec.lewy == pom)
             {
                 pom.ojciec.waga++;
             }
             else
             {
                 pom.ojciec.waga--;
             }
             Balansuj(pom.ojciec);
         }
     }
     else if (pom.waga == 2 && pom.lewy.waga == 1)
     {
         RR(pom);
     }
     else if (pom.waga == -2 && pom.prawy.waga == -1)
     {
         LL(pom);
     }
     else if (pom.waga == 2 && pom.lewy.waga == -1)
     {
         LR(pom);
     }
     else if (pom.waga == -2 && pom.prawy.waga == 1)
     {
         RL(pom);
     }
 }
Ejemplo n.º 7
0
 public void Wstaw(String s)
 {
     //System.GC.Collect();
     if (korzen == null)
     {
         korzen = new Wyraz(s);
     }
     else
     {
         Wyraz wstawiany = new Wyraz(s);
         Wyraz aktualny  = korzen;
         while (true)
         {
             if (wstawiany.wyraz == aktualny.wyraz)
             {
                 //Console.WriteLine("to jest juz w slowniku :(");
                 break;
             }
             if (aktualny.prawy == null && String.Compare(wstawiany.wyraz, aktualny.wyraz) > 0)
             {
                 aktualny.prawy   = wstawiany;
                 wstawiany.ojciec = aktualny;
                 break;
             }
             else if (aktualny.lewy == null && String.Compare(wstawiany.wyraz, aktualny.wyraz) < 0)
             {
                 aktualny.lewy    = wstawiany;
                 wstawiany.ojciec = aktualny;
                 break;
             }
             else if (String.Compare(wstawiany.wyraz, aktualny.wyraz) < 0)
             {
                 aktualny = aktualny.lewy;
             }
             else if (String.Compare(wstawiany.wyraz, aktualny.wyraz) > 0)
             {
                 aktualny = aktualny.prawy;
             }
         }
     }
 }
Ejemplo n.º 8
0
        private void Balansuj2(Wyraz balansowany)
        {
            if (balansowany.waga == 1 || balansowany.waga == -1)
            {
                return;
            }
            if (balansowany.waga == 0)
            {
                if (balansowany != korzen)
                {
                    if (balansowany.ojciec.lewy == balansowany)
                    {
                        balansowany.ojciec.waga--;
                    }
                    else
                    {
                        balansowany.ojciec.waga++;
                    }
                    Balansuj2(balansowany.ojciec);
                }
            }
            if (balansowany.waga == -2 && balansowany.prawy.waga == 0)
            {
                LL(balansowany);
            }
            else if (balansowany.waga == 2 && balansowany.lewy.waga == 0)
            {
                RR(balansowany);
            }
            else if (balansowany.waga == -2 && balansowany.prawy.waga == -1)
            {
                Wyraz pom = balansowany.prawy;

                LL(balansowany);
                if (pom != korzen)
                {
                    if (pom.ojciec.lewy == balansowany)
                    {
                        pom.ojciec.waga--;
                    }
                    else
                    {
                        pom.ojciec.waga++;
                    }
                    Balansuj2(pom.ojciec);
                }
            }
            else if (balansowany.waga == 2 && balansowany.lewy.waga == 1)
            {
                Wyraz pom = balansowany.lewy;

                RR(balansowany);

                if (pom != korzen)
                {
                    if (pom.ojciec.lewy == pom)
                    {
                        pom.ojciec.waga--;
                    }
                    else
                    {
                        pom.ojciec.waga++;
                    }

                    Balansuj2(pom.ojciec);
                }
            }
            else if (balansowany.waga == -2 && balansowany.prawy.waga == 1)
            {
                Wyraz pom = balansowany.prawy.lewy;
                RL(balansowany);
                if (pom != korzen)
                {
                    if (pom.ojciec.lewy == pom)
                    {
                        pom.ojciec.waga--;
                    }
                    else
                    {
                        pom.ojciec.waga++;
                    }
                    Balansuj2(pom.ojciec);
                }
            }
            else if (balansowany.waga == 2 && balansowany.lewy.waga == -1)
            {
                Wyraz pom = balansowany.lewy.prawy;
                LR(balansowany);
                if (pom != korzen)
                {
                    if (pom.ojciec.lewy == pom)
                    {
                        pom.ojciec.waga--;
                    }
                    else
                    {
                        pom.ojciec.waga++;
                    }
                    Balansuj2(pom.ojciec);
                }
            }
        }
Ejemplo n.º 9
0
        public void Usun(String s)
        {
            Wyraz doUsuniecia = Szukaj(s);

            if (doUsuniecia != null)
            {
                if (doUsuniecia.prawy == null && doUsuniecia.lewy == null) //jesli brak synow
                {
                    if (doUsuniecia != korzen)
                    {
                        if (doUsuniecia.ojciec.lewy == doUsuniecia)
                        {
                            doUsuniecia.ojciec.lewy = null;
                            doUsuniecia.ojciec.waga--;
                        }
                        else
                        {
                            doUsuniecia.ojciec.prawy = null;
                            doUsuniecia.ojciec.waga++;
                        }
                        Balansuj2(doUsuniecia.ojciec);
                    }
                    else
                    {
                        korzen = null;
                    }
                }
                else if (doUsuniecia.prawy == null) // jesli ma tylko jednego syna (lewego)
                {
                    doUsuniecia.lewy.ojciec = doUsuniecia.ojciec;
                    if (doUsuniecia != korzen)
                    {
                        if (doUsuniecia.ojciec.lewy == doUsuniecia)
                        {
                            doUsuniecia.ojciec.lewy = doUsuniecia.lewy;
                            doUsuniecia.ojciec.waga--;
                        }
                        else
                        {
                            doUsuniecia.ojciec.prawy = doUsuniecia.lewy;
                            doUsuniecia.ojciec.waga++;
                        }

                        Balansuj2(doUsuniecia.ojciec);
                    }
                    else
                    {
                        korzen = doUsuniecia.lewy;
                    }
                }
                else if (doUsuniecia.lewy == null)//jesli ma syna prawego
                {
                    doUsuniecia.prawy.ojciec = doUsuniecia.ojciec;
                    if (doUsuniecia != korzen)
                    {
                        if (doUsuniecia.ojciec.lewy == doUsuniecia)
                        {
                            doUsuniecia.ojciec.lewy = doUsuniecia.prawy;
                            doUsuniecia.ojciec.waga--;
                        }
                        else
                        {
                            doUsuniecia.ojciec.prawy = doUsuniecia.prawy;
                            doUsuniecia.ojciec.waga++;
                        }
                        Balansuj2(doUsuniecia.ojciec);
                    }
                    else
                    {
                        korzen = doUsuniecia.prawy;
                    }
                }
                else //jesli jest dwoch synow
                {
                    Wyraz nastepnik = doUsuniecia.prawy;

                    while (true) //szukanie nastepnika
                    {
                        if (nastepnik.lewy == null)
                        {
                            break;
                        }
                        nastepnik = nastepnik.lewy;
                    }
                    Wyraz pom;
                    nastepnik.waga = doUsuniecia.waga;
                    if (nastepnik.ojciec != doUsuniecia)
                    {
                        pom = nastepnik.ojciec;
                    }
                    else
                    {
                        pom = nastepnik;
                        nastepnik.waga++;
                    }
                    if (nastepnik.prawy != null && nastepnik.ojciec != doUsuniecia) //jesli nastepnik ma prawego syna
                    {
                        nastepnik.prawy.ojciec = nastepnik.ojciec;
                        nastepnik.ojciec.lewy  = nastepnik.prawy;
                        nastepnik.ojciec.waga--;
                    }
                    else if (nastepnik.ojciec != doUsuniecia)//jesli go nie ma
                    {
                        nastepnik.ojciec.lewy = null;
                        nastepnik.ojciec.waga--;
                    }

                    if (doUsuniecia == korzen) //jesli usuwamy korzen
                    {
                        korzen           = nastepnik;
                        nastepnik.ojciec = null;
                    }
                    else
                    {
                        nastepnik.ojciec = doUsuniecia.ojciec;

                        if (doUsuniecia.ojciec.lewy == doUsuniecia)
                        {
                            doUsuniecia.ojciec.lewy = nastepnik;
                        }
                        else
                        {
                            doUsuniecia.ojciec.prawy = nastepnik;
                        }
                    }

                    if (doUsuniecia.prawy != nastepnik)
                    {
                        nastepnik.prawy        = doUsuniecia.prawy;
                        nastepnik.prawy.ojciec = nastepnik;
                    }

                    if (doUsuniecia.lewy != null)
                    {
                        nastepnik.lewy          = doUsuniecia.lewy;
                        doUsuniecia.lewy.ojciec = nastepnik;
                    }
                    else
                    {
                        nastepnik.lewy = null;
                    }
                    Balansuj2(pom);
                }
            }
        }