Sletting i binært søketre

stemmer
0

Så når jeg sletter i binært søketre, må jeg ha som 7 forskjellige tilfeller dvs.

  1. Venstre Leaf;
  2. Høyre Leaf;
  3. Venstre barn med bare igjen barn. // dvs. noden som skal slettes er venstre barn av sin overordnede, og det har bare igjen barn.
  4. Venstre Barn med bare høyre barn.
  5. Høyre barn med bare igjen barn.
  6. Høyre barn med bare høyre barn.
  7. Node som skal slettes har både barna dvs. høyre og venstre.

Nå når denne koden er å bruke if-elsedet blir ganske ekkel .. er det noen annen måte å gjøre dette.

Her er mitt kodebiten

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;
}
Publisert på 30/09/2011 klokken 05:10
kilden bruker
På andre språk...                            


3 svar

stemmer
1

Slette en NULL-peker ikke har noen dårlig effekt. Så bør du være i stand til å gjøre dette uten spesielle tilfeller. Den grunnleggende delen er bare:

delete current->left;
delete current->right;
Svarte 30/09/2011 kl. 05:14
kilden bruker

stemmer
3

Du kan holde det mye enklere enn det, og bare begrense deg til tre tilfeller når du sletter en node fra et BST (binært søketre):

  1. en node uten barn (et blad): bare fjerne det - ingenting spesielle behov som må gjøres
  2. en node med ett barn: fjerne den, og flytte barnet på plass
  3. en node med to barn: bytte den ut med enten dens i-rekkefølge forgjenger eller etterfølger, og deretter fjerne den

Den wikiside inneholder et eksempel på hvordan dette kan se ut i kode.

Eller som en svært grunnleggende eksempel i 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);
}
Svarte 30/09/2011 kl. 05:18
kilden bruker

stemmer
2

Jeg forstår ikke helt protokollen som brukes for å slette her. Du ser ut til å ikke ha en binær 'søk' tre (ingen bestilling på treet).

Men å bare gjøre koden enkle. Du kan gjøre noe sånt som dette:

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

Du bør også bruke slette unngå minnelekkasjer her. Håper det hjelper.

Svarte 30/09/2011 kl. 05:33
kilden bruker

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