Binært søketre - Slett

stemmer
1

Jeg prøver å skrive et program som tar i strenger og plasserer dem i et binært søketre i alfabetisk rekkefølge når disse er satt inn i treet, ber en bruker for ett ord som skal slettes, og dermed slette noden fra treet, og deretter utgangen treet uten at noden tilbake i rekkefølge.

Alt fungerer for opp til slettefunksjonen, gjør slettefunksjonen arbeid, men det er veldig merkelig hvordan det slettes. Jeg tror tiden det sletter en hel side av treet, fordi når jeg sletter det siste ordet, det vanligvis fungerer. Jeg vil laste opp min slettefunksjonen, og hvis mer er nødvendig jeg kan laste opp resten av min kode.

Takk!

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;
    }
};
Publisert på 31/03/2011 klokken 02:24
kilden bruker
På andre språk...                            


2 svar

stemmer
1

Dine saker for enten høyre eller venstre vesen NULLer bra. Men din logikk for ingen av dem er NULLer, dessverre, sviktende.

Hvis jeg leser koden din (og forstå funksjonen replace_parent()riktig, så hvis verken treet er tom du skal bytte ut dagens rot med Left.

Spør deg selv - hva som skjer med de verdiene som er i Rightundertreet?

Hva du trenger å gjøre for å slette en node er som følger:

  1. Angi en av undertrærne. Det ser ut som du har valgt din Lefttreet, så vi får gå derfra.
  2. Følg motsatt linje av grener. I dette eksempelet, fortsett ned Righttrærne fra den opprinnelige Left. Fortsett til du finner en høyre-bladnode (ingen Rightundertrær, Lefter OK)
  3. Husk verdien av høyre-blad i en tmpvariabel.
  4. Overfør høyre bladets Left(enten NULLeller ikke) til høyre-blad posisjon.
  5. Ta tmpverdi og sette det inn i den opprinnelige 'to-delete' node.
Svarte 31/03/2011 kl. 02:38
kilden bruker

stemmer
2

Lacqui er riktig i hans poeng.

la meg fortelle deg at når du sletter en node må du erstatte den med enten max node i venstre undertreet eller minimumspunktet i den høyre undertreet. For eksempel: Hvis du ser under bildet: skriv bildebeskrivelse her

Hvis du ønsker å slette noden 90, må du passe på at du erstatter den med enten 80 som er maks sin node i venstre subtre eller 92 som minimumspunktet i den høyre undertreet. du kan holde noen tilnærming.

så algo vil være: vurderer venstre sub treet:

-> hvis du finner noden slette, navigere til max verdi i sin venstre sub treet.

-> tilordne nodens venstre som 50 og node rett til å være 150

-> lage 75-> neste som null og slette 90

Svarte 18/04/2011 kl. 10:22
kilden bruker

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