数据结构:二叉搜索树

删除二叉搜索树中的一个结点

有3种情况:
该结点
1.没有儿子
2.有一个儿子
3.有两个儿子
前两种比较简单,第三种可以选择左子树的最大结点或者右子树的最小结点来顶替该结点,占据该结点位置。
我们本着先找到待删除结点,再分情况讨论的原则。

struct Node* Delete(Node* root, int data) {
	if (root == NULL)
		return root;
	else if (root->data > data)
		root->left = Delete(root->left, data);
	else if(root->data < data)
		root->right = Delete(root->right, data);
	else {
		//找到待删除结点,分情况讨论
	}
}

下面是函数完整代码

struct Node* Delete(Node* root, int data) {
	if (root == NULL)
		return root;
	else if (root->data > data)
		root->left = Delete(root->left, data);
	else if(root->data < data)
		root->right = Delete(root->right, data);
	else {
		//找到待删除结点,分情况讨论
		//no child,one child,two children
		if (root->left == root->right == NULL) {
			delete root;//释放空间
			root = NULL;
		}
		else if (!root->left) {
			//显然,我们需要释放内存
			struct Node* temp = root;
			root = root->right;
			delete temp;
		}
		else if (!root->right) {
			struct Node* temp = root;
			root = root->left;
			delete temp;
		}
		else {//有两个孩子,这里我们找右子树中的最小值
			struct Node* temp = FindMin(root->right);
			root->data = temp->data;
			root->right = Delete(root->right, temp->data);
		}
	}
}

找右子树最小值

Node* FindMin(Node*root) {
	if (!root)
		return NULL;
	while (root->left) {
		root=root->left;
	}
	return root;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值