Binární vyhledávací strom - Odstranit

hlasů
1

Snažím se napsat program, který bere v řetězcích a umístí je do binárního vyhledávacího stromu v abecedním pořadí, jakmile budou vloženy do stromu, uživatel požádá o jedno slovo, které mají být odstraněny, čímž se zrušením tohoto uzlu ze stromu, a pak výstup strom, aniž by tento uzel zpět do pořádku.

Vše funguje na to až do smazání funkce vymazání funkce funguje, ale jeho velmi podivné, jak to odstraní. Myslím, že v současné době odstraní plnou stranu stromu, protože když jsem odstranit poslední slovo, to obvykle funguje. Budu nahrát svůj smazat funkci a je-li zapotřebí více mohu nahrát zbytek mého kódu.

Dík!

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;
    }
};
Položena 31/03/2011 v 03:24
zdroj uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
1

Vaše pouzdra pro buď levou nebo pravou bytosti NULLjsou dobré. Nicméně, vaše logika ani jeden z nich je NULLjiž bohužel nedaří.

Pokud jsem četl váš kód (a porozumění funkci replace_parent()správně, pokud ani jeden strom je prázdný měníte aktuální kořen s Left.

Zeptejte se sami sebe - co se děje s hodnotami, které jsou v Rightpodstromu?

To, co je třeba udělat, aby odstranit uzel je následující:

  1. Zadejte jeden z podstromů. Vypadá to, že jste si vybrali svůj Leftpodstrom, takže půjdeme odtud.
  2. Sledujte opačnou řadu poboček. V tomto příkladu, pokračuj dolů Rightpodstromy od originálu Left. Pokračujte, dokud nenajdete pravým koncový uzel (bez Rightpodstromy, Leftje v pořádku)
  3. Pamatovat hodnotu svého pravého křídla v tmpproměnné.
  4. Přenést na pravé křídlo je Left(ať NULLnebo ne) na pozici pravého listu je.
  5. Vezměte tmphodnotu a vložte jej do svého původního ‚to-delete‘ uzlu.
Odpovězeno 31/03/2011 v 03:38
zdroj uživatelem

hlasů
2

Lacqui je správné v jeho bodech.

dovolte mi říci, že při mazání uzlu je třeba jej nahradit buď max uzlu v levém podstromu, nebo minimální uzel v pravém podstromu. Například: pokud vidíte na obrázku níže: zadejte popis obrázku zde

Chcete-li odstranit uzel 90, je třeba dávat pozor, aby jej nahradit buď 80, která je jejím max uzel v levém podstromu nebo 92, která je minimální uzel v pravém podstromu. můžete mít jakýkoliv jeden přístup.

takže algo bude: s ohledem na levý dílčí strom:

-> pokud zjistíte, že uzel, který chcete odstranit, přejděte na maximální hodnotu v jeho levém podstromu.

-> přiřadit opustili Uzel jako 50 a právo uzlu být 150

-> dělat 75-> vedle as null a odstraňovat 90

Odpovězeno 18/04/2011 v 11:22
zdroj uživatelem

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