delecja w wyszukiwaniu binarnym drzewie

głosy
5

I dano dwa drzewa binarne wyszukiwania. Na przykład, A i B. Następnie poproszono mnie, aby usunąć drzewa B z drzewa A.

Przez usunięcie, to znaczy usunięcie wszystkich węzłów znajdujących się w B z A. Uwaga: B niekoniecznie jest poddrzewo A.

np:
A:

      50   
     / \  
    10  75  
   /   / \  
  1   60   90                 

B:

     10
     / \
    1   75

Powstały drzewo powinno być:

     50
       \
        60
         \ 
          90

Dwa podejścia przyszedł do mojego umysłu:
A1:
węzeł * deleteTree (węzeł * A, węzeł B *);
Zapoznaj się z korzenia drzewa B. Usunąć ten węzeł z drzewa A (według normalnego sposobu usunięcia BST). Następny problem podzielić na dwie części - dla lewego poddrzewa B i prawego poddrzewa B. Dla każdego poddrzewa, recurse. Dla lewego poddrzewa, węzeł, który zajęty węzeł, który został usunięty, powinien służyć jako korzeń dla drzewa A. Na prawym poddrzewie, następca Inorder usuniętego węzła powinien serwer jako korzeń dla drzewa A.

A2: Drugie podejście jest trochę dziwne. Uważam, że Inorder i preorder Przechodzenie drzewa A. Znajdź i usuń wszystkie węzły w drzewie B stosując wyszukiwanie binarne wraz z rekursji (my nie modyfikować zamĂłwienia przedpremierowego). Wreszcie recostruct naszą BST z Inorder (pozostały) i przedsprzedaży (bez zmian).

Prob A: znalezienie skutecznego sposobu na BST.
Prob B: znalezienie skutecznego sposobu na każdym drzewie binarnym (nie tylko BST).

Utwórz 31/08/2011 o 10:06
źródło użytkownik
W innych językach...                            


2 odpowiedzi

głosy
0

Tak jak ja to widzę, dlaczego nie można zrobić przechodzenie inorder B. Następnie, aż tablica nie jest pusty, robić regularne usuwanie z punktu A do wartości indeksu tablicy. Przechodzenie O (n) i usunięć każdy wskaźnik będzie O (logn). Łącznie ta operacja będzie O (nlogn).

Odpowiedział 31/08/2011 o 10:27
źródło użytkownik

głosy
6

pROBLEM

Zakładam, że te dwa drzewa są zrównoważone.

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

Czas złożoność:

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

Tak więc całkowita złożoność wynosi O (N) według głównego twierdzenia. Przestrzeń złożoność O (1) . Jedną wadą jest to, że zniszczeniu B.

PS: Nie mam implementację BST pod ręką, więc nie mogę przetestować kod. Ale myślę, że pomysł jest poprawne.

problem B

Użyj tabeli mieszania dla jednego drzewa i przemierzać drugiego. Dostaniesz O (n) dla czasu i przestrzeni złożoności.

Odpowiedział 31/08/2011 o 14:12
źródło użytkownik

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