Deletion in binärer Suchbaum

stimmen
0

Wenn ich also in binärer Suchbaum löschen, muss ich wie 7 verschiedene Fälle haben müssen, dh

  1. Links Blatt;
  2. Rechts Blatt;
  3. Linkes Kind mit nur links Kind. // dh der Knoten gelöscht werden, ist das linke Kind es ist Eltern und es hat nur Kind verlassen.
  4. Kind mit nur rechts Kind verlassen.
  5. Rechts Kind mit nur links Kind.
  6. Rechts Kind mit nur rechtem Kind.
  7. Knoten werden gelöscht hat sowohl die Kinder, also rechts und links.

Nun , wenn dieser Code verwendet if-elsees ziemlich böse bekommt .. gibt es eine andere Art und Weise , dies zu tun.

Hier ist mein Code-Schnipsel

if(current->left==NULL && current->right==NULL && current->key<prev->key)   //left leaf
prev->left=NULL;
else if(current->left==NULL && current->right==NULL && current->key>prev->key) // right     leaf
prev->right=NULL;
else if(current->left!=NULL && current->right==NULL && current->key<prev->key) // left     child with one child
prev->left=current->left;
else if(current->left==NULL && current->right!=NULL && current->key<prev->key)
prev->left=current->right;
else if(current->left!=NULL && current->right==NULL && current->key>prev->key)
prev->right=current->left;
else if(current->left==NULL && current->right!=NULL && current->key>prev->key)
prev->right=current->left;
else if(current->left!=NULL && current->right!=NULL)
{
    check=current->right;
    check1=check;
    while(check->left!=NULL)
    {
    check1=check;
    check=check->left;
    }
    *current=*check;
    check1->left=NULL;
}
Veröffentlicht am 30/09/2011 um 06:10
quelle vom benutzer
In anderen Sprachen...                            


3 antworten

stimmen
1

einen NULL-Zeiger zu löschen hat keine schädliche Wirkung. Also, sollten Sie in der Lage sein, dies ohne besondere Fälle zu tun. Der Hauptteil ist einfach:

delete current->left;
delete current->right;
Beantwortet am 30/09/2011 um 06:14
quelle vom benutzer

stimmen
3

Sie können es halten viel einfacher als das, und einfach sich auf drei Fälle beschränken, wenn ein Knoten von einem BST (binäre Suchbaum) zu löschen:

  1. ein Knoten ohne Kinder (ein Blatt): es einfach entfernen - nichts Besonderes getan werden muss
  2. ein Knoten mit einem Kind: es, entfernen und das Kind an seinem Platz bewegen
  3. ein Knoten mit zwei Kindern: tauschen sie entweder mit seiner in Ordnung Vorgänger oder Nachfolger, und es dann entfernen

Die Wiki - Seite enthält ein Beispiel, wie dies in Code aussehen könnte.

Oder als sehr einfaches Beispiel in C:

if (current->left==NULL && current->right==NULL) {
    /* leaf node */
    bst_replace(current, NULL);
}
else if (current->left==NULL || current->right==NULL) {
    /* node with one child */
    bst_replace(current, ((current->left) ? current->left : current->right));
}
else {
    /* node with two children */
    Node* successor = bst_next(current);
    current->data = successor->data;
    bst_replace(successor, successor->right);
}
Beantwortet am 30/09/2011 um 06:18
quelle vom benutzer

stimmen
2

Das verstehe ich nicht wirklich das verwendete Protokoll hier zum Löschen. Sie scheinen nicht eine binäre ‚Suche‘ Baum haben (keine Bestellung im Baum).

Aber nur den Code einfach. Man könnte so etwas tun:

bool b1 = (current->left == NULL);
bool b2 = (current->right == NULL);
bool b3 = (current->key > prev->key);

int decision_case = b1 * 4 + b2 * 2 + b3;

switch(decision_case) {
  case 0: // fill in code here
          break;
  ...
  ...
  case 7: // fill in code here
          break;
}

Außerdem sollten Sie verwenden löschen Speicherlecks hier zu vermeiden. Ich hoffe, das hilft.

Beantwortet am 30/09/2011 um 06:33
quelle vom benutzer

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