Binarne drzewo poszukiwań - Usuń

głosy
1

Próbuję napisać program, który odbywa się w ciągi i umieszcza je w binarnym drzewie wyszukiwania w kolejności alfabetycznej raz te są wstawiane do drzewa, użytkownik pyta o jedno słowo ma zostać usunięty, a tym samym usunięcie tego węzła z drzewa, a następnie wyjście drzewo bez tego węzła z powrotem w porządku.

Wszystko działa za to do funkcji kasowania, funkcja kasowania działa, ale jego bardzo dziwne jak to usunie. Myślę, że obecnie usuwa pełnej strony drzewa, bo gdy usunę ostatnie słowo, to zwykle działa. Będę przesłać moją funkcję usuwania, a jeśli potrzebne jest więcej mogę przesłać resztę kodu.

Dzięki!

template<typename T> void Delete(TreeNode<T>*& root, const T& data)
{
    if (root == NULL)
        return;
        if(data < root->Value)
            return Delete(root->Left, data);
        else if (root->Value > data)
            return Delete(root->Right, data);
        else
        {
            TreeNode<T>* old_root = root;
            if (root->Left == NULL)
            {
                root = root->Right;
            }
            else if (root->Right == NULL)
            {
                root = root->Left;
            }
            else
            {
                replace_parent(old_root, old_root->Left);
            }
            delete old_root;



    }

};

template<typename T> void replace_parent(TreeNode<T>*& old_root, TreeNode<T>*& root)
{
    if (root->Right != NULL)
    {
        replace_parent(old_root, root->Right);
    }
    else
    {
        old_root->Value = root->Value;
        old_root = root;
        root = root->Left;
    }
};
Utwórz 31/03/2011 o 03:24
źródło użytkownik
W innych językach...                            


2 odpowiedzi

głosy
1

Twoje etui na prawej lub lewej istoty NULLsą dobre. Jednak logika dla żadnego z nich jest NULLto, niestety, niepowodzeniem.

Jeśli Czytam kodu (i zrozumienie funkcji replace_parent()prawidłowo, a następnie, jeśli nie drzewo jest pusty wymieniasz aktualny z korzenia Left.

Zadaj sobie pytanie - co się dzieje z wartościami, które są w Rightpoddrzewie?

Co trzeba zrobić, aby usunąć węzeł jest w następujący sposób:

  1. Wpisz jeden z poddrzew. Wygląda na to, że wybrałeś swoje Leftpoddrzewa, więc będziemy go stamtąd.
  2. Postępuj zgodnie z przeciwną linię oddziałów. W tym przykładzie, nie poddawać się w dół Rightpoddrzewa z oryginałem Left. Nie poddawać się, aż znajdziesz węzeł prawym skrzydle (nie Rightpoddrzewa; Leftjest OK)
  3. Pamiętaj wartość swojego prawym liściu w tmpzmiennej.
  4. Przenieść prawym liścia Left(czy NULLteż nie) do pozycji prawym liścia.
  5. Weź tmpwartość i umieścić go w oryginalnym węźle „do-delete”.
Odpowiedział 31/03/2011 o 03:38
źródło użytkownik

głosy
2

Lacqui jest poprawna w swoich punktach.

powiem ci, że podczas usuwania węzła trzeba zastąpić ją albo max węzła w drzewie po lewej sub lub minimalnej węzła w prawym sub drzewa. Na przykład: jeśli patrz poniższy obrazek: wprowadzić opis obrazu tutaj

jeśli chcesz usunąć węzeł 90, trzeba zadbać, aby zastąpić ją albo 80, która jest jego max węzeł w lewym poddrzewie lub 92 których minimalna węzeł w prawym sub drzewa. można przechowywać dowolny jedno podejście.

więc algo będą: zważywszy na lewo poddrzewo:

-> jeśli okaże się węzeł do usunięcia, przejdź do maksymalnej wartości w jego lewe poddrzewa.

-> przypisać opuścił węzła jako 50 i prawego węzła być 150

-> dokonać 75-> obok jako nieważną i usuwanie 90

Odpowiedział 18/04/2011 o 11:22
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more