Vypuštění v binárním vyhledávacím stromu

hlasů
5

Dostal jsem dva binární vyhledávací stromy. Například A a B. Dále jsem byl požádán o odstranění stromu B ze stromu A.

Delecí, myslím odstranit všechny uzly, které jsou v B z A. Poznámka: B není nutně podstromu A.

například:
A:

      50   
     / \  
    10  75  
   /   / \  
  1   60   90                 

B:

     10
     / \
    1   75

Výsledný strom by měl být:

     50
       \
        60
         \ 
          90

Oba tyto přístupy mě napadlo:
A1:
node * deleteTree (node * A, uzel * B);
Vezměte kořen stromu B. Odstranění tohoto uzlu ze stromu A (podle obvyklé metody BSt vypouští se). Vedle rozdělit problém na dvě části - na levém podstromu B a pravého podstromu B. Pro každou z podstromu, recurse. V levém podstromu je uzel, který zabíral uzel, který byl odstraněn by měl sloužit jako kořen stromu pro A. Pro správnou podstromu na nezbytného nástupce odstraněného uzlu by serveru jako kořen stromu pro A.

A2: Druhý přístup je trochu divný. Zjistil jsem, nezbytného a preorder traversal stromu A. Najít a odstranit všechny uzly stromu B pomocí binárního vyhledávání spolu s rekurze (nemáme modifikovat preorder). Nakonec recostruct naší BST z nezbytného (zbývající) a předobjednávku (beze změny).

Prob A: najít účinný způsob, jak BST.
Prob B: najít efektivní způsob, jak pro jakýkoli binární strom (ne jen BST).

Položena 31/08/2011 v 10:06
zdroj uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
0

Způsob, jakým to vidím já, proč si dělat nezbytného traversal b. Potom, až se pole není prázdné, dělat pravidelné odstranění od a pro hodnotu indexu pole. Předávání je O (n), a vypouští se pro každý index bude O (logn). Zcela, tato operace bude O (nlogn).

Odpovězeno 31/08/2011 v 10:27
zdroj uživatelem

hlasů
6

problém A

Předpokládám, že oba stromy jsou vyrovnané.

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);
    }
}

Časová náročnost:

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

Takže celková složitost je O (N), v souladu s hlavní věta. Složitost prostor je O (1) . Jednou nevýhodou je, destrukci I B.

PS: Já nemám implementaci BST po ruce, takže nemohu vyzkoušet kód pro vás. Ale myslím, že myšlenka je správná.

problém B

Použít hash tabulky pro jeden strom a přejít další. Získáte O (N) pro časové a prostorové složitosti.

Odpovězeno 31/08/2011 v 14:12
zdroj uživatelem

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