Bináris keresés Tree - törlése

szavazat
1

Én próbálok írni egy program, mely a húrok, és elhelyezi őket egy bináris keresési fa alfabetikus sorrendben, ha ezek kerülnek be a fát, a felhasználó kéri egy szót el kell hagyni, így kiiktatva a csomópont a fáról, majd kimenet a fa nélkül, hogy node vissza sorrendben.

Minden működik, erre akár a törlés funkciót, a törlés funkció működik, de nagyon furcsa, hogy hogyan törli. Szerintem jelenleg ez törli a teljes oldalon a fa, mert amikor törli az utolsó szó, általában működik. Fogom feltölteni a törlés funkciót, és ha ennél többre van szükség tudok feltölteni a többi az én kódot.

Kösz!

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;
    }
};
A kérdést 31/03/2011 03:24
a forrás felhasználó
Más nyelveken...                            


2 válasz

szavazat
1

Az esetek balra vagy jobbra lény NULLjók. Azonban a logika sem közülük NULL, sajnos, nem működnek.

Ha Olvasom a kódot (és működésének megértéséhez replace_parent()rendesen, akkor, ha sem a fa üres cseréli az aktuális gyökér Left.

Kérdezd meg magadtól - mi történik az értékek, amelyek a Rightrészfa?

Mit kell tennie annak érdekében, hogy törölje a csomópontot a következő:

  1. Adja meg az részfák. Úgy tűnik, megvan az Leftrészfa, így fogunk menni onnan.
  2. Kövesse a szemközti sorban ágak. Ebben a példában folyamatosan megy le a Rightrészfákat az eredeti Left. Menj tovább, amíg meg nem találja a jobb levél csomópont (nincs Rightrészfák, Leftrendben van)
  3. Emlékezz az értékét a jobb levél egy tmpváltozó.
  4. Transzfer a jobb LEAF Left(akár NULL, vagy nem), hogy a jobb levél helyzetét.
  5. Vegyük az tmpértéket, és tedd be az eredeti „to-delete” csomópontot.
Válaszolt 31/03/2011 03:38
a forrás felhasználó

szavazat
2

Lacqui helyes az ő pont.

hadd mondjam el, hogy a törlés közben egy csomópontot ki kell cserélni azt vagy a max csomópont bal al-fa vagy a minimális csomópontot a jobb al-fa. például: ha úgy látja, azt az alábbi kép: írja kép leírása itt

Ha törölni szeretné a csomópont 90, meg kell vigyázni, hogy cserélje ki vagy 80, amely a max csomópont a bal részfa vagy a 92, amely a minimális csomópontot a jobb al-fa. tarthatja bármelyike ​​megközelítés.

így az algo lesz: tekintve a bal al-fa:

-> ha megtalálja a csomópont törölni, keresse meg a max értéket bal al fa.

-> hozzárendelése a csomópont bal, mint 50, és csomópont jogot, hogy 150

-> make 75-> következő null és törlése 90

Válaszolt 18/04/2011 11:22
a forrás felhasználó

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