Törlés bináris keresési fa

szavazat
0

Tehát, ha törlök bináris keresési fa, akkor is kell, hogy mint 7 különböző esetekben, azaz

  1. Bal Leaf;
  2. Jobb Leaf;
  3. Bal gyermek csak elhagyta gyermekét. // azaz a törlendő csomópontra a bal gyermeke ez a szülő, és azt csak a bal gyerek.
  4. Bal Gyermek egyetlen helyes gyerek.
  5. Jobb gyermek csak elhagyta gyermekét.
  6. Jobb gyermek egyetlen helyes gyerek.
  7. Node törölni kell azt mind a gyermekek, azaz jobbra és balra.

Most, amikor ezt a kódot használja if-elseez lesz elég csúnya .. van más módja ennek.

Itt van a kódrészletet

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;
}
A kérdést 30/09/2011 06:10
a forrás felhasználó
Más nyelveken...                            


3 válasz

szavazat
1

Törlése NULL pointer nincs káros hatással. Szóval, akkor képesnek kell lennie, hogy ezt nem különleges esetekben. Az alapvető része csak:

delete current->left;
delete current->right;
Válaszolt 30/09/2011 06:14
a forrás felhasználó

szavazat
3

A tiéd lehet egy sokkal egyszerűbb, mint ezt, és egyszerűen korlátozza magát, hogy három esetben törlésekor egy csomópontot az BST (bináris keresési fa):

  1. Egy csomópont gyermek nélkül (a levél): csak vegye ki - semmi különös tennivaló
  2. a csomópont egy gyermeke: távolítsa el, és mozgassa a gyermeket a helyén
  3. csomópont, két gyermek: cseréld akár annak a rend korábbi, vagy utódja, majd vegye

A wiki oldal tartalmaz egy példát, hogy ez hogyan néz ki a kódot.

Vagy mint egy nagyon egyszerű példa a 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);
}
Válaszolt 30/09/2011 06:18
a forrás felhasználó

szavazat
2

Nem igazán értem a használt protokoll törlését itt. Úgy tűnik, hogy nem egy bináris keresés "fa (nincs rendezés a fa).

De csak, hogy a kód egyszerű. Lehet tenni valamit, mint ez:

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

Is, akkor kell használni törölni , hogy ne memóriavesztés itt. Remélem segít.

Válaszolt 30/09/2011 06:33
a forrás felhasználó

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