Binary Search Tree - Verwijder

stemmen
1

Ik ben op zoek naar een programma dat draait in strings en plaatst ze in een binaire zoekboom in alfabetische volgorde zodra deze in de boom worden ingevoegd schrijven, een gebruiker vraagt ​​om een ​​woord te worden geschrapt, dus dat knooppunt van de boom te verwijderen, en vervolgens uitgang van de boom zonder dat knooppunt weer op orde.

Alles werkt voor deze tot aan de delete-functie, de delete-functie werkt wel, maar het is heel raar hoe het verwijdert. Ik denk momenteel schrapt een volledige kant van de boom, want toen ik het laatste woord te verwijderen, het meestal werkt. Ik zal mijn wisfunctie te uploaden en als er meer nodig is, kan ik de rest van mijn code te uploaden.

Bedankt!

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;
    }
};
De vraag is gesteld op 31/03/2011 om 03:24
bron van user
In andere talen...                            


2 antwoorden

stemmen
1

Uw cases voor zowel het linker- of rechter wezen NULLzijn goed. Echter, uw logica voor geen van hen die NULLis helaas niet.

Als ik het lezen van uw code (en de functie te begrijpen replace_parent()correct, maar dan als geen boom is leeg u de huidige wortel te vervangen door Left.

Stel jezelf de vraag - wat er gebeurt met de waarden die in de Rightsub-boom?

Wat u moet doen om een ​​knooppunt te verwijderen is als volgt:

  1. Voer een van de substructuren. Het lijkt erop dat je je hebt gekozen Leftsubtree, dus we gaan vanaf daar.
  2. Volg de tegenoverliggende lijn vertakkingen. In dit voorbeeld, blijf naar beneden gaan de Rightsubstructuren van uw oorspronkelijke Left. Blijf doorgaan tot je een recht-leaf node te vinden (geen Rightsubstructuren, Leftis OK)
  3. Denk aan de waarde van uw recht-blad in een tmpvariabele.
  4. Transfer van de rechter-blad Left(al NULLof niet) de positie van de rechter-blad's.
  5. Neem de tmpwaarde en zet het in je oorspronkelijke 'to-delete' node.
antwoordde op 31/03/2011 om 03:38
bron van user

stemmen
2

Lacqui is juist in zijn punten.

laat me je vertellen dat, terwijl het verwijderen van een knooppunt die u nodig hebt om het te vervangen met ofwel de max knooppunt in de linker sub-boom of de minimum knooppunt in de juiste sub-boom. bijvoorbeeld: als je de foto hieronder: voer image beschrijving hier

als je wilt het knooppunt 90 te verwijderen, moet u zorgen dat u deze vervangen door ofwel 80 die is zijn max knooppunt in de linker deelboom of 92 die de minimale knooppunt in de juiste sub-boom. je kan iemand aanpak te houden.

zodat de algo zal zijn: rekening houdend met de linker sub-boom:

-> Als u het knooppunt vinden om te verwijderen, gaat u naar de maximale waarde in zijn linker sub boom.

-> toewijzen links van het knooppunt 50 en het knooppunt recht op 150

-> maken 75-> volgende als van nul en verwijderen 90

antwoordde op 18/04/2011 om 11:22
bron van user

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