İkili Arama Ağacı - Sil

oy
1

Ben dizelerinde alır ve bu ağaca yerleştirilen bir kez alfabetik bir ikili arama ağacında yerleştiren bir program yazmaya çalışıyorum, bir kullanıcı bir kelime böylece ağaçtan bu düğümü silme Silinecek ister ve sonra çıktı geri sırayla o düğüm olmadan ağacı.

Her şey silme işlevine bunun için ayakta çalışır, silme işlevi çalışır, ancak siler nasıl onun çok garip. Ben son sözü sildiğinizde, genellikle çalıştığı için şu anda o ağacın tam tarafını siler düşünüyorum. Benim silme fonksiyonu yükleyecek ve daha gerekiyorsa benim kod kalanını yükleyebilirsiniz.

Teşekkürler!

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;
    }
};
Oluştur 31/03/2011 saat 03:24
kaynak kullanıcı
Diğer dillerde...                            


2 cevaplar

oy
1

Sağ veya sol varlık İçin vakalar NULLiyidir. Ancak, onları olmanın ne için mantık NULLise maalesef başarısız.

Ben kodunuzu okuma (ve fonksiyonunu anlamak ediyorsam replace_parent()doğru, o zaman ne ağacı mevcut kök değiştiriyorsanız boşsa Left.

Kendinize sorun - içindedir değerlere neler olduğunu Rightalt ağaç?

aşağıdaki gibi Ne bir düğüm silmek için yapmanız gereken ise:

  1. Alt ağaçlardan birini girin. Bu sizin seçtiğiniz benziyor Leftalt ağacı, bu yüzden oradan devam edeceğiz.
  2. Takip zıt şube hattı. Bu örnekte, düşmeye devam RightOrijinalinizden alt ağaçlar Left. Eğer sağ yaprak düğümü bulana kadar devam edin (hiçbir Rightalt ağaçlar; LeftTamam)
  3. Bir de sağ-yaprak değerini hatırla tmpdeğişken.
  4. Sağ yapraklı en aktarın Left(olsun NULLveya olmasın) sağ yaprağın konumuna getirin.
  5. Al tmpdeğeri ve orijinal 'to-sil' düğüme koydu.
Cevap 31/03/2011 saat 03:38
kaynak kullanıcı

oy
2

Lacqui yaptığı noktalarda doğrudur.

Bana bir düğüm silerken sol alt ağacında maksimum düğüm veya sağ alt ağaçtaki asgari düğüm ya ile değiştirmek gerektiğini size söyleyeyim. Örneğin: Aşağıdaki resme bakın eğer: Burada görüntü açıklama girin

Eğer düğüm 90 silmek istiyorsanız, size ya sol alt ağacındaki onun maksimum düğüm olan 80 veya 92 ile değiştirin olduğunu dikkat çekmek gerekir ki doğru alt ağaçta asgari düğüm. Eğer herhangi bir kimse yaklaşımı tutabilir.

böylece algo olacak: sol alt ağacını dikkate:

-> silmek düğümü bulursanız, sol alt ağacında maksimum değere gidin.

-> 150 olması 50 ve düğüm hak olarak düğümün sol atama

-> Bir sonraki sıra boş> 75- yapmak ve 90 silme

Cevap 18/04/2011 saat 11:22
kaynak kullanıcı

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