Deletie in binaire zoekboom

stemmen
0

Dus toen ik verwijder in binaire zoekboom, moet ik als 7 verschillende gevallen ie hebben

  1. Left Leaf;
  2. Right Leaf;
  3. Links kind met alleen links kind. // dat wil zeggen het knooppunt dat u wilt verwijderen is de linker kind van zijn ouder en het is alleen links kind.
  4. Links Kind met enige juiste kind.
  5. Rechts kind met alleen links kind.
  6. Rechts kind met enige juiste kind.
  7. Knooppunt worden verwijderd, is zowel de kinderen wil zeggen rechts en links.

Nu wanneer deze code gebruikt if-elsekrijgt het redelijk smerig .. is er een andere manier om dit te doen.

Hier is mijn code snippet

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;
}
De vraag is gesteld op 30/09/2011 om 06:10
bron van user
In andere talen...                            


3 antwoorden

stemmen
1

een NULL pointer wissen heeft geen nadelige gevolgen. Ja, dan moet je in staat zijn om dit te doen zonder speciale gevallen. De basis deel is gewoon:

delete current->left;
delete current->right;
antwoordde op 30/09/2011 om 06:14
bron van user

stemmen
3

Je kunt het een stuk eenvoudiger dan dat te houden, en gewoon jezelf te beperken tot drie gevallen bij het verwijderen van een knooppunt van een BST (binary search boom):

  1. een knooppunt zonder kinderen (een blad): verwijder het gewoon - niets bijzonders moet worden gedaan
  2. een knooppunt met een kind: verwijderen en verplaatsen het kind op zijn plaats
  3. een knooppunt twee kinderen: ruilen met ofwel de involgorde voorganger of opvolger en verwijder deze

De wiki-pagina bevat een voorbeeld van hoe dit eruit zou kunnen zien in de code.

Of als een zeer eenvoudig voorbeeld 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);
}
antwoordde op 30/09/2011 om 06:18
bron van user

stemmen
2

Ik begrijp niet echt het protocol dat wordt gebruikt voor de hier te verwijderen. Je lijkt een binair 'search' tree (geen sortering in de boom) niet hebben.

Maar om gewoon de code eenvoudig. Je zou zoiets als dit te doen:

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

Ook moet u gebruik maken verwijderen om geheugenlekken hier voorkomen. Hoop dat het helpt.

antwoordde op 30/09/2011 om 06:33
bron van user

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