Delece v binárním vyhledávacím stromu

hlasů
0

Takže když jsem vymazat v binárním vyhledávacím stromu, musím mít, jako je 7 různých případů, tj

  1. Left Leaf;
  2. Pravá Leaf;
  3. Opustil dítě jen s levou dítětem. // tj uzel který má být vymazán, je levá dítě z jeho rodič a to má jen opustila dítě.
  4. Opustil dítě pouze s pravým dítětem.
  5. Pravá dítě jen s levou dítětem.
  6. Pravá dítě s jediným pravým dítětem.
  7. Uzel, který bude smazán se oba synové tedy doprava a doleva.

Nyní, když je tento kód pomocí if-elsese dostane pěkně ošklivý .. Existuje nějaký jiný způsob, jak toho dosáhnout.

Tady je můj kód úryvek

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;
}
Položena 30/09/2011 v 06:10
zdroj uživatelem
V jiných jazycích...                            


3 odpovědí

hlasů
1

Odstranění ukazatel NULL nemá žádný negativní vliv. Takže, měli byste být schopni to udělat bez zvláštních případech. Základní část je právě:

delete current->left;
delete current->right;
Odpovězeno 30/09/2011 v 06:14
zdroj uživatelem

hlasů
3

Si můžete udržet mnohem jednodušší, než to, a jednoduše omezit sami na tři případy, kdy smazání uzlu z BST (binary vyhledávacího stromu):

  1. uzel bez dětí (list): stačí odstranit ji - nic zvláštního, je třeba učinit
  2. uzel s jedním dítětem: odstraňte ji a přesuňte dítě na svém místě
  3. uzel se dvěma dětmi: vyměnit to buď svým v řádu předchůdce nebo nástupce, a následně ji

Stránky wiki obsahuje příklad, jak by to mohlo vypadat v kódu.

Nebo jako velmi základní například v 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);
}
Odpovězeno 30/09/2011 v 06:18
zdroj uživatelem

hlasů
2

Nemám opravdu pochopit, protokol používaný pro vymazání tady. Zdá se, že není binární ‚Hledat‘ strom (bez objednání na stromě).

Ale jen aby kód jednoduché. Dalo by se udělat něco takového:

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

Také byste měli použít odstranit , aby se zabránilo úniku paměti zde. Naděje, která pomáhá.

Odpovězeno 30/09/2011 v 06:33
zdroj uživatelem

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