deleție într-un arbore binar de căutare

voturi
5

Am fost dat doi arbori de căutare binare. De exemplu, A și B. Apoi, am fost rugat să ștergeți copac B din copac A.

Prin ștergere, vreau să spun șterge toate nodurile prezente în B de la A. Notă: B nu este în mod necesar un subarbore de A.

de exemplu:
A:

      50   
     / \  
    10  75  
   /   / \  
  1   60   90                 

B:

     10
     / \
    1   75

Rezultând copac ar trebui să fie:

     50
       \
        60
         \ 
          90

Două abordări a venit în minte:
A1:
nod * deleteTree (nod * A, nodul B *);
Ia rădăcina arborelui B. Ștergeți acest nod din arbore A (prin metoda normală de ștergere BST). În continuare împărți problema în două părți - pentru subarborele stâng al lui B și subarborele drept al B. Pentru fiecare dintre subramificație, recurse. Pentru subarborele stâng, nodul care a ocupat nodul care a fost șters ar trebui să servească drept rădăcină pentru copac A. Pentru subarborelui drept, succesorul inordine al nodului șters ar trebui ca serverul rădăcină pentru copac A.

A2: Cealaltă abordare este un pic ciudat. Am găsi inordine si precomandă traversal arborelui A. Găsiți și șterge toate nodurile din arborele B utilizând binar de căutare, împreună cu recursivitate (noi nu modifica precomanda). În cele din urmă recostruct BST nostru din Inorder (rămase) și precomanda (neschimbat).

Prob A: Găsiți un mod eficient pentru BST.
Prob B: Găsiți un mod eficient pentru orice arbore binar (nu doar BST).

Întrebat 31/08/2011 la 10:06
sursa de către utilizator
În alte limbi...                            


2 răspunsuri

voturi
0

Modul în care văd eu, de ce nu faci o parcurgeri inordine de b. Apoi, până când matrice nu este gol, face o regulat șterge dintr-o pentru valoarea indicelui de matrice. Parcurgeri este O (n) și ștergere pentru fiecare indice va fi O (logn). În total, această operație va fi O (nlogn).

Publicat 31/08/2011 la 10:27
sursa de către utilizator

voturi
6

problemă A

Presupun cei doi arbori sunt echilibrate.

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

Timp de complexitate:

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

Deci complexitatea generală este O (N) în conformitate cu teorema maestru. Complexitatea spațiului este O (1) . Un dezavantaj este că B. distrus

PS: Nu am o implementare BST la îndemână, așa că nu pot testa codul pentru tine. Dar cred că ideea este corectă.

problemă B

Utilizați tabelul hash pentru un singur copac și traversa altul. Vei primi O (N) pentru atât timp și complexitatea spațiu.

Publicat 31/08/2011 la 14:12
sursa de către utilizator

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