簡體   English   中英

二進制搜索樹中的刪除

[英]Deletion in binary search tree

所以當我在二分搜索樹中刪除時,我是否需要有7種不同的情況,即

  1. 左葉;
  2. 右葉;
  3. 左子只有左子。 //即要刪除的節點是其父節點的左子節點,並且只有左子節點。
  4. 左子與唯一的右子。
  5. 右子只有左子。
  6. 合適的孩子,只有合適的孩子。
  7. 要刪除的節點有兩個子節點,即右和左。

現在,當此代碼使用if-else它變得非常討厭..還有其他方法可以做到這一點。

這是我的代碼片段

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

您可以使它比這簡單得多,並且在從BST(二進制搜索樹)中刪除節點時,僅將自己限制為三種情況:

  1. 沒有子節點(葉子)的節點:只需將其刪除-無需執行任何特殊操作
  2. 一個有一個孩子的節點:將其刪除,然后將孩子移動到其位置
  3. 一個有兩個子節點的節點:將其與有序的前任節點或后繼節點交換,然后將其刪除

Wiki頁面包含一個示例,說明了它如何在代碼中顯示。

或作為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);
}

我不太了解用於此處刪除的協議。 您似乎沒有二進制的“搜索”樹(樹中沒有排序)。

但是只是使代碼簡單。 您可以執行以下操作:

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

另外,您應該使用Delete來避免此處的內存泄漏。 希望能有所幫助。

刪除NULL指針不會有不良影響。 因此,您應該能夠在沒有特殊情況的情況下執行此操作。 基本部分是:

delete current->left;
delete current->right;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM