Ștergerea în arbore binar de căutare

voturi
0

Așa că atunci când am șters în arbore binar de căutare, am nevoie pentru a avea ca 7 cazuri diferite, și anume

  1. Frunza stânga;
  2. Leaf pe dreapta;
  3. Stânga copil cu copil doar la stânga. // adică nodul care urmează să fie șters este copilul stâng al e-mamă și-a lăsat doar copil.
  4. Stânga copil cu copil numai dreapta.
  5. copil pe dreapta cu copilul doar la stânga.
  6. copil dreapta doar cu copil dreapta.
  7. Nodul care urmează să fie șters atât a copiilor, adică dreapta și la stânga.

Acum , când acest cod folosește if-elsedevine destul de urât .. există nici un alt mod de a face acest lucru.

Iată fragmentul de cod meu

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;
}
Întrebat 30/09/2011 la 06:10
sursa de către utilizator
În alte limbi...                            


3 răspunsuri

voturi
1

Ștergerea unui pointer nul nu are nici un efect bolnav. Deci, ar trebui să fie capabil să facă acest lucru fără cazuri speciale. Partea de bază este doar:

delete current->left;
delete current->right;
Publicat 30/09/2011 la 06:14
sursa de către utilizator

voturi
3

Puteți să-l păstrați mult mai simplu decât atât, și pur și simplu să limiteze-te la trei cazuri la ștergerea unui nod dintr-un BST (binar de căutare copac):

  1. un nod fără copii (o frunză): doar elimina - nimic nevoi speciale care urmează să fie făcut
  2. un nod cu un singur copil: scoateți-l, și pentru a muta copilul în locul său
  3. un nod cu doi copii: l schimb cu predecesorul său, fie în ordine sau succesor, și apoi scoateți-l

Pagina wiki conține un exemplu de modul în care acest lucru ar putea arăta în cod.

Sau ca un exemplu foarte de bază în 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);
}
Publicat 30/09/2011 la 06:18
sursa de către utilizator

voturi
2

Nu înțeleg cu adevărat protocolul utilizat pentru ștergerea aici. Se pare să nu aibă un arbore binar „căutare“ (fără ordonare în copac).

Dar pentru a face doar simplu cod. Ai putea face ceva de genul:

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

De asemenea, ar trebui să utilizați ștergeți pentru a evita pierderi de memorie aici. Sper că vă ajută.

Publicat 30/09/2011 la 06:33
sursa de către utilizator

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