在二叉排序树中删除一个结点

本文探讨了在二叉排序树中删除一个节点的方法,包括删除叶子节点、单子树节点以及拥有左右子树的节点。通过调整树结构保持二叉排序树性质,特别提到了用右子树的最小元素或左子树的最大元素替代被删除节点的策略。内容参考自浙江大学的数据结构课程。
摘要由CSDN通过智能技术生成

在二叉排序树中删除一个结点

在二叉排序树中删除一个结点时,不能把以该结点为根的子树上的结点都删除,必须先把被删除结点从存储二叉排序树的链表上摘下,将因删除结点而断开的二叉链表重新链接起来,同时确保二叉排序树的性质不会丢失。

二叉排序树的删除要考虑三种情况:

  1. 若被删除结点x是叶子结点,则直接删除,并修改x的父结点的指针为NULL;
  2. 若被删除结点x只有一棵左子树或右子树,则让x的子树成为x父结点的子树,替代x的位置;
  3. 若被删除结点x有左、右两棵子树,则用另一结点替代被删除的结点x:x右子树的最小元素或者x左子树的最大元素,然后删除这个替代结点(因为在二叉排序树中右子树的最小元素、左子树的最大元素要么是叶子结点,要么只有一棵左子树或右子树,一定不会同时有左、右子树,这样就转换成了第一或第二种情况);

如有谬误或者不足还请批评指正!

BSTree Delete(BSTree BST, int x)
{
   
	BSTNode *p;
	if (BST == NULL) //如果树为空直接返回
		return NULL;
	else if 
  • 15
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是二叉排序树删除操作的代码,包含了上述三种情况的处理: ``` // 删除二叉排序树值为data的节点 void deleteNode(BSTree &root, int data) { BSTree p = root, f = nullptr; // p指向要删除结点,f指向p的双亲结点 while (p != nullptr && p->data != data) { // 查找要删除结点 f = p; // 记录当前结点的双亲结点 if (data < p->data) { p = p->left; } else { p = p->right; } } if (p == nullptr) { // 没有找到要删除结点 return; } if (p->left == nullptr && p->right == nullptr) { // 要删除结点为叶子结点 if (p == root) { // 要删除结点为根结点 root = nullptr; } else if (p == f->left) { // 要删除结点为f的左子结点 f->left = nullptr; } else { // 要删除结点为f的右子结点 f->right = nullptr; } delete p; } else if (p->left != nullptr && p->right == nullptr) { // 要删除结点只有左子树 if (p == root) { // 要删除结点为根结点 root = p->left; } else if (p == f->left) { // 要删除结点为f的左子结点 f->left = p->left; } else { // 要删除结点为f的右子结点 f->right = p->left; } delete p; } else if (p->left == nullptr && p->right != nullptr) { // 要删除结点只有右子树 if (p == root) { // 要删除结点为根结点 root = p->right; } else if (p == f->left) { // 要删除结点为f的左子结点 f->left = p->right; } else { // 要删除结点为f的右子结点 f->right = p->right; } delete p; } else { // 要删除结点既有左子树又有右子树 BSTree q = p->left, s = p; // q指向p的左子树,s指向p while (q->right != nullptr) { // 查找p的左子树最大的结点,即q的右子树最右下角的结点 s = q; q = q->right; } p->data = q->data; // 用q的值替换p的值 if (s == p) { // q是p的左孩子 s->left = q->left; } else { // q是p的左孩子的右子孙 s->right = q->left; } delete q; } } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值