İkili arama ağacında silme

oy
5

İki ikili arama ağaçları verilmiştir. Örneğin, A ve B Sonra, ben ağaç A'dan ağaç B silmek istendi

silinmesi ile, yani A. Not B içerisinde bulunan tüm düğümleri silin: B ille A. bir alt ağaç değil

Örneğin:
A:

      50   
     / \  
    10  75  
   /   / \  
  1   60   90                 

B:

     10
     / \
    1   75

Ortaya ağacı olmalıdır:

     50
       \
        60
         \ 
          90

: Iki yaklaşım aklıma gelen
A1:
düğümü * deleteTree (düğüm * A, düğüm * B);
(Normal BSt silme yöntemi ile) ağaç A'dan Bu düğümü sil ağaç B. kökünü alın. Sonraki iki bölüme sorunu bölmek - B sol alt ağaç ve alt ağacı, recurse her biri için B'nin sağ alt ağaç için. Sol alt ağaç için, silindi düğüm işgal Düğüm ağacı A. için root olarak gerektiği sunucu, sağ alt ağaç için ağaç A. için kök olarak silinen düğümün inorder halefi hizmet etmeli

A2: Diğer yaklaşım biraz garip. Ağaç A. inorder ve ön sipariş geçişi bulun ve (biz ön sipariş değiştirmek yok) özyineleme ile birlikte ikili arama kullanarak ağaç B tüm düğümleri silmek bulabilirsiniz. Nihayet (kalan) cihazın gücünü ve ön sipariş (değişmedi) bizim BST recostruct.

Bir prob: BST için verimli bir yol bulun.
Prob B: Herhangi İkili ağacı (sadece BST) için verimli bir yol bulun.

Oluştur 31/08/2011 saat 10:06
kaynak kullanıcı
Diğer dillerde...                            


2 cevaplar

oy
0

Eğer b bir inorder geçişini yapmayın neden öyle anlıyorum. Dizi boş değil kadar Sonra, düzenli bir dizi endeksinin değeri için silmek yok. Geçiş her dizin olacak için O (n) ve silme O (logn). Tamamen, bu işlem, O (nlogn) olacaktır.

Cevap 31/08/2011 saat 10:27
kaynak kullanıcı

oy
6

sorun bir

İki ağaç dengeli olduğunu varsayıyorum.

void deleteTree(node* A, node* B)
{
    if(A == NULL || B == NULL)
        return;

    if(A->data == B->data)
    {
        deleteTree(A->left, B->left);
        deleteTree(A->right, B->right);
        removeNode(A); // Normal BST remove
    }
    else if(A->data > B->data)
    {
        Node* right = B->right;
        B->right = NULL;
        deleteTree(A->left, B);
        deleteTree(A, right);
    }
    else // (A->data < B->data)
    {
        Node* left = B->left;
        B->left = NULL;
        deleteTree(A->right, B);
        deleteTree(A, left);
    }
}

Zaman karmaşıklığı:

T(N) = 2 * T(N / 2) + O(1)

Bu nedenle, genel karmaşıklığı O (N) ana teoremine göre yöntem. Alan karmaşıklığı O (1) . Bir dezavantajı B tahrip olduğu

Not: Ben bu yüzden sizin için kod test edemez el altında bir BST uygulaması yok. Ama bir fikir doğru olduğunu düşünüyorum.

sorun B

Bir ağaç için karma tablosunu kullanın ve başka çapraz. Sen alacak O (N) zaman ve bellek karmaşıklığını ikisi için.

Cevap 31/08/2011 saat 14:12
kaynak kullanıcı

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