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)); }
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; } } } }