Beispiel #1
0
        public Wezel ZnajdzRodzica(int klucz) // O(logn)
        {
            if (klucz < Wartosc)
            {
                if (Lewy == null)
                {
                    return(null);
                }
                if (Lewy.Wartosc == klucz)
                {
                    return(this);
                }
                return(Lewy.ZnajdzRodzica(klucz));
            }

            if (Prawy == null)
            {
                return(null);
            }
            if (Prawy.Wartosc == klucz)
            {
                return(this);
            }
            return(Prawy.ZnajdzRodzica(klucz));
        }
Beispiel #2
0
        public void ZamienZOjcem(int klucz) // O(logn), ogólnie zamiana jest O(1) ale znajdowanie rodzica jest O(logn)
        {
            if (glowa == null)
            {
                return;
            }

            Wezel Rodzic = glowa.ZnajdzRodzica(klucz);

            if (Rodzic == null)
            {
                return;
            }

            // Zależnie czy klucz jest prawym czy lewym dzieckiem mamy inne rotacje
            if (Rodzic.Lewy != null && Rodzic.Lewy.Wartosc == klucz) // Rotacja prawa
            {
                // po zamianie dziadek ma wskazywać na węzeł z kluczem
                Wezel dziadek = glowa.ZnajdzRodzica(Rodzic.Wartosc);

                Wezel Pom = Rodzic.Lewy;
                Rodzic.Lewy = Pom.Prawy;
                Pom.Prawy   = Rodzic;

                // Rodzic = Pom;
                if (dziadek == null)
                {
                    glowa = Pom;
                }
                else
                {
                    if (dziadek.Lewy != null && dziadek.Lewy == Rodzic)
                    {
                        dziadek.Lewy = Pom;
                    }
                    else
                    {
                        dziadek.Prawy = Pom;
                    }
                }
            }
            else // Rotacja lewa
            {
                // po zamianie dziadek ma wskazywać na węzeł z kluczem
                Wezel dziadek = glowa.ZnajdzRodzica(Rodzic.Wartosc);

                Wezel Pom = Rodzic.Prawy;
                Rodzic.Prawy = Pom.Lewy;
                Pom.Lewy     = Rodzic;

                // Rodzic = Pom;
                if (dziadek == null)
                {
                    glowa = Pom;
                }
                else
                {
                    if (dziadek.Lewy != null && dziadek.Lewy == Rodzic)
                    {
                        dziadek.Lewy = Pom;
                    }
                    else
                    {
                        dziadek.Prawy = Pom;
                    }
                }
            }
        }