二分搜索树如何删除节点
- 删除最小值
- 删除最大值
- 删除任意一节点
举个例子:
删除最小值,首先要找到最小值
Node * getMin(Node* node) {
if(node->left ==NULL)
return node;
return getMin(node->left)
}
Node* removeMin(Node* node)
{
if(node->left==NULL)
{
Node* rightNode = node->right;
delete node;
count--;
return rightNode;
}
removeMin(node->left)
}
如图,如果58没有 60那个右边节点,直接把50拼到41这个根节点上
但是,现在这个问题是,58有右孩子,58这个位置不可缺少,移除58的话,就必须有人能够顶替58,有此可见,我们选择 50的右孩子53
或者 60的左孩子 59,都可以顶替 58
我们使用 Hubbard deletion 算法解决
代码示例:
Node* remove(Node* node,Key key) {
if(node==NULL)
return NULL;
if(key<node->left) {
//要把自己减小,才有机会找到相等的
node->left = remove(node->left,key);
return node;
}else if(key> node->key)
{
node->right = remove(node->right,key);
return node;
}else{
//如果找到了值相等的点,就要进行移除操作了,注意,对于平衡二叉树,要保持左右两边树的平衡,两边都要检查
if(node->left==NULL)
{
Node* rightNode = node->right;
delete node;
count--;
return rightNode;
}
if(node->right==NULL) {
Node* leftNode = node->left;
delete node;
count--;
return leftNode;
}
Node * delNode = node;
Node* successor = minimum(node->right);
successor->right = removeMin(node->right);
successor->left = node->left;
delete delNode;
count--;
return successor;
}
}