所以当我在二进制搜索树中删除时,我是否需要有7种不同的情况,即
-
左叶;
-
右叶;
-
只有左孩子的左孩子 . //i.e要删除的节点是它父节点的左子节点,它只剩下子节点 .
-
只有正确孩子的左孩子 .
-
只有左孩子的右孩子 .
-
只有正确孩子的正确孩子 .
-
要删除的节点包含两个子节点,即右侧和左侧 .
现在当这段代码使用 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;
}
3 回答
您可以比它简单得多,并且在从BST(二叉搜索树)中删除节点时仅限于三种情况:
没有孩子的节点(叶子):只需删除它 - 没有什么特别需要做的
包含一个子节点的节点:将其删除,并将子节点移动到位
具有两个子节点的节点:将其与其有序前置任务或后继节点交换,然后将其删除
wiki page包含了一个如何在代码中查看的示例 .
或者作为C中的一个非常基本的例子:
我真的不明白这里用来删除的协议 . 您似乎没有二进制“搜索”树(树中没有排序) .
但只是简单地使代码 . 你可以这样做:
此外,您应该使用 delete 来避免内存泄漏 . 希望有所帮助 .
删除NULL指针没有任何不良影响 . 所以,你应该能够做到这一点,没有特殊情况 . 基本部分只是: