deletie in een binaire zoekboom

stemmen
5

Ik heb gekregen twee binary search bomen. Bijvoorbeeld, A en B. Vervolgens werd ik gevraagd om de boom B te verwijderen uit de boom A.

Door deletie, bedoel ik verwijder alle knooppunten aanwezig in B van A. Opmerking: B is niet per se een substructuur van A.

bijvoorbeeld:
A:

      50   
     / \  
    10  75  
   /   / \  
  1   60   90                 

B:

     10
     / \
    1   75

Resulterend boom zou moeten zijn:

     50
       \
        60
         \ 
          90

Twee benaderingen kwam naar mijn mening:
A1:
knooppunt * deleteBoom (knooppunt * A, knooppunt * B);
Neem de wortel van de boom B. Verwijder dit knooppunt uit A (bij normale BSt verwijderingsmethode). Naast verdelen het probleem in twee delen - voor het linker deelboom van B en de rechter deelboom van B. Voor elke deelboom, recurse. Voor de linker deelboom, dient de knooppunt dat het knooppunt dat bezet werd verwijderd dienen als uitgangspunt voor boom A. de rechter deelboom, inorder de opvolger van de verwijderde server knooppunt dient als uitgangspunt voor tree A.

A2: De andere aanpak is een beetje raar. Ik vind de inorder en preorder traversal van de boom A. Zoek en alle knopen in de boom B verwijderen met behulp van binaire zoeken samen met recursie (we niet de preorder te wijzigen). Tenslotte recostruct onze bst van de inorder (resterende) en de preorder (ongewijzigd).

Prob A: Vind een efficiënte manier voor BST.
Prob B: Vind een efficiënte manier voor een binaire boom (niet alleen BST).

De vraag is gesteld op 31/08/2011 om 10:06
bron van user
In andere talen...                            


2 antwoorden

stemmen
0

De manier waarop ik het zie, waarom dan niet je een inorder traversal van b doen. Dan, totdat de array niet leeg is, doe een regelmatige verwijderen uit een voor de waarde van de array index. Traversal O (n) en verwijdering per index zal O (logn). Volledig zal deze operatie O (nlogn).

antwoordde op 31/08/2011 om 10:27
bron van user

stemmen
6

probleem A

Ik neem aan dat de twee bomen in balans zijn.

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

Tijd complexiteit:

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

Dus de totale complexiteit O (N) volgens meester stelling. De ruimte complexiteit O (1) . Een nadeel is vernietigd I B.

PS: Ik heb geen BST implementatie bij de hand, dus ik kan niet de code te testen voor u. Maar ik denk dat het idee juist is.

probleem B

Gebruik hash tafel voor een boom en doorkruisen de andere. U krijgt O (N) voor zowel tijd en ruimte complexiteit.

antwoordde op 31/08/2011 om 14:12
bron van user

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