因此,当我在二叉搜索树中删除时,我是否需要有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;
}
答案 0 :(得分:3)
你可以比它简单得多,并且在从BST(二叉搜索树)中删除节点时,仅限于三种情况:
wiki page包含一个代码示例。
或者作为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);
}
答案 1 :(得分:2)
我真的不明白这里删除的协议。您似乎没有二进制“搜索”树(树中没有排序)。
但是要使代码变得简单。你可以这样做:
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;
}
此外,您应该使用删除来避免内存泄漏。 希望有所帮助。
答案 2 :(得分:1)
删除NULL指针没有任何不良影响。所以,你应该能够做到这一点,没有特殊情况。基本部分只是:
delete current->left;
delete current->right;