Löschung in einem binären Suchbaum

stimmen
5

Ich habe zwei binäre Suchbäume gegeben. Zum Beispiel, A und B. Als nächstes wurde ich gebeten, den Baum B vom Baum A. lösche

Durch Deletion, meine ich in B alle Knoten von A. Hinweis vorhanden löschen: B ist nicht notwendigerweise eine Unterstruktur von A.

zB:
A:

      50   
     / \  
    10  75  
   /   / \  
  1   60   90                 

B:

     10
     / \
    1   75

Daraus resultierende Baum sollte sein:

     50
       \
        60
         \ 
          90

Zwei Ansätze kam mir in den Sinn:
A1:
Knoten * deleteTree (Knoten * A, Knoten * B);
Nehmen Sie die Wurzel des Baumes B. löschen Knoten von Baum A (durch normale BSt Löschmethode). Weiter unterteilt das Problem in zwei Teile - für den linken Teilbaum B und der rechten Teilbaum von B. Für jede der Teilstruktur rekursiv. Für den linken Teilbaum, den der Knoten der Knoten belegt , die für den rechten Teilbaum als Wurzel für Baum A. dienen, die Inorder Nachfolger des gelöschten Knoten sollte Server als Stammbaum für A. gelöscht sollte

A2: Der andere Ansatz ist ein wenig seltsam. Ich finde die Inorder und Vorordnungsdurchquerung Baum A. finden und alle Knoten im Baum B löschen zusammen mit Rekursion binäre Suche (wir die Preorder nicht ändern). Schließlich recostruct unsere bst vom Inorder (Rest-) und der Preorder (unverändert).

Prob A: Hier finden Sie eine effiziente Möglichkeit für BST.
Prob B: Finden Sie eine effiziente Möglichkeit , für jede Binary Tree (nicht nur BST).

Veröffentlicht am 31/08/2011 um 10:06
quelle vom benutzer
In anderen Sprachen...                            


2 antworten

stimmen
0

So wie ich es sehe, warum Sie eine Inorder Traversal von b nicht tun. Dann, bis das Array nicht leer ist, macht regelmäßig von einem für den Wert des Array-Index löscht. Traversal ist O (n) und das Löschen für jeden Index wird O (logn). Total, dieser Vorgang wird O (n log n).

Beantwortet am 31/08/2011 um 10:27
quelle vom benutzer

stimmen
6

Problem A

Ich nehme an, die beiden Bäume ausgeglichen sind.

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

Zeitkomplexität:

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

So dass die Gesamtkomplexität ist O (N) nach Master-Theorem. Der Raum ist die Komplexität O (1) . Ein Nachteil ist , ich B. destructed

PS: Ich habe keine BST Implementierung bei der Hand haben, so kann ich nicht den Code für Sie testen. Aber ich denke, dass die Idee richtig ist.

Problem B

Verwenden Hash - Tabelle für einen Baum und durchquert eine andere. Sie erhalten O (N) sowohl für Zeit und Raum Komplexität.

Beantwortet am 31/08/2011 um 14:12
quelle vom benutzer

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