删除二叉树的节点

二分搜索树如何删除节点

  • 删除最小值
  • 删除最大值
  • 删除任意一节点
举个例子:
删除最小值,首先要找到最小值
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;
    }


}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值