törlés bináris keresési fa

szavazat
5

Azt kaptak két bináris keresési fák. Például, az A és B Ezután megkértek, hogy törölje a fa B a fáról A.

By törlés, mármint törölje az összes csomók B A. Megjegyzés: B nem feltétlenül részfáját A.

pl:
A:

      50   
     / \  
    10  75  
   /   / \  
  1   60   90                 

B:

     10
     / \
    1   75

Kapott fát kell:

     50
       \
        60
         \ 
          90

Két megközelítés jutott eszembe:
A1:
node * deleteTree (node * A csomópont * B);
Vegyük a gyökere fa B. törlése csomópont fáról A (normál BSt törlés módszer). Következő osztani a problémát két részre - a bal részfa a B és a jobb részfa B. Az egyes részfa, recurse. A bal oldali részfa, a csomópont, amely elfoglalta a csomópont, amelyet törölni kell szolgálnia a gyökér a fa A. A jobb oldali részfa, a inorder utódja a törölt csomópont kell szervert root fák A.

A2: A másik megközelítés egy kicsit furcsa. Találom a inorder és előrendelésre bejárása fa A. Keresse meg és törölje az összes csomópont fa B bináris kereséssel együtt rekurzió (mi dont módosítani a előrendelésre). Végül recostruct a BST a inorder (maradék), és az előrendelési (változatlan).

PROB A: Find egy hatékony módja a BST.
Prob B: talál egy hatékony módon bármilyen bináris fa (nem csak BST).

A kérdést 31/08/2011 10:06
a forrás felhasználó
Más nyelveken...                            


2 válasz

szavazat
0

Ahogy én látom, miért nem csinál egy inorder bejárása b. Aztán amíg a tömb nem üres, akkor egy szabályos törölni egy az érték a tömb index. A bejárás az O (n) és deléciós egyes indexe is O (logn). Teljesen, ez a művelet lesz O (nlogn).

Válaszolt 31/08/2011 10:27
a forrás felhasználó

szavazat
6

probléma A

Feltételezem, hogy a két fa kiegyensúlyozottak.

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

Időbonyolultsága:

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

Így a teljes komplexitása O (N) szerinti mester tétel. A tér komplexitás O (1) . Egy hátránya van én megsemmisült B.

PS: Nem tudom a BST végrehajtása kéznél, így nem tudom tesztelni a kódot az Ön számára. De azt hiszem, az ötlet helyességét.

probléma B

Használja hash tábla egy fa, és áthalad a másik. Kapsz O (N) mind időben és térben összetettségét.

Válaszolt 31/08/2011 14:12
a forrás felhasználó

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