二叉排序树的删除

本文介绍了二叉排序树中删除节点的方法,包括考虑不同情况下子树的重新链接:删除叶子节点、仅一侧有子树的节点及两侧都有子树的节点等。针对最后一种情况,还特别讨论了寻找替代节点的策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在二叉排序树中删除一结点,要考虑删除点子树的情况,在删除了指定点后,要将其子树重新链接起来,

分情况计论,如果想要删除叶结点,只需将其父结点指向它的指针,指向NULL,再释放它即可,如果被删除结点的右子树为空,可以拿它的左子树结点顶替它的位置,再释放它,如果被删结点的左子树为空,可以拿它的右子树结子顶替它,




如果被删结点左右子树都不空,可以在它的右子树中寻找中序的第一个结点(关键字最小),用它的值填补删结点,之后再业处理这个结点的删除问题,还可找被删除结点左子树的中序的最后一个结点(关键字在左子树中最大),用它来填补被删结点




bool deleteBSTree(BSTree &root ,int e){

	BSTree p = NULL ;
	BSTree s = NULL ;
	BSTree  ptr = NULL;
	p = searchBS( root,e,ptr);

	if(!p)return false;
	if(p->lchild!=NULL&&p->rchild!=NULL){
			s = p->lchild;
			//下面的几步主要是为了使ptr成为删除点p的前驱
			if(s->rchild==NULL&&s->lchild==NULL){
				ptr = p;			
			}
			while(s->rchild!=NULL){
				ptr = s;
				s = s->rchild;
			}
			p->data= s->data;
			p=s;	
	}

	if(p->lchild==NULL&&p->rchild!=NULL){
	
			s = p->rchild;

	}else if(p->lchild!=NULL&&p->rchild==NULL){
	
		s=p->lchild;
	
	}else if(p->lchild==NULL&&p->rchild==NULL){
		if(ptr->data<p->data)
			ptr->rchild = NULL;
		else  if(ptr->data>p->data)
			ptr->lchild = NULL;
	
		return true;
	}

	if(p==root){	
	root = s;
	}else if(ptr->data<s->data){
		ptr->rchild = s;
	}else if(ptr->data>s->data){
		ptr->lchild = s;
		
	}
	free(p);
	return true;

}

BSTNode *searchBS(BSTNode * root,int e,BSTree  &father){
	
	BSTNode * p = root;
	father =NULL;

		while(p!=NULL&&p->data!=e){
			
			father = p;
			if(p->data<e) p=p->rchild;
			else p = p->lchild;	
		
	}
	return p;

}






好的,我来为您解答如何实现二叉排序树的查找。 1. 定义二叉排序树的查找算法函数 二叉排序树的查找算法函数可以使用递归或迭代方式实现,以下是一个递归实现的示例代码: ```python def search_bst(root, val): if not root or root.val == val: return root elif root.val > val: return search_bst(root.left, val) else: return search_bst(root.right, val) ``` 2. 二叉排序树的插入算法函数 二叉排序树的插入算法函数也可以使用递归或迭代方式实现,以下是一个递归实现的示例代码: ```python def insert_bst(root, val): if not root: return TreeNode(val) elif root.val > val: root.left = insert_bst(root.left, val) else: root.right = insert_bst(root.right, val) return root ``` 3. 建立二叉排序树的插入算法 建立二叉排序树的插入算法可以使用一个循环来不断插入新的节点,以下是一个示例代码: ```python def build_bst(nums): if not nums: return None root = TreeNode(nums[0]) for i in range(1, len(nums)): insert_bst(root, nums[i]) return root ``` 4. 二叉排序树删除一个结点的操作实现 二叉排序树删除一个结点的操作需要考虑多种情况,包括删除的节点有无子节点、删除的节点只有一个子节点、删除的节点有两个子节点等,以下是一个示例代码: ```python def delete_bst(root, val): if not root: return None if root.val == val: if not root.left: return root.right if not root.right: return root.left if root.left and root.right: temp = root.right while temp.left: temp = temp.left root.val = temp.val root.right = delete_bst(root.right, temp.val) elif root.val > val: root.left = delete_bst(root.left, val) else: root.right = delete_bst(root.right, val) return root ``` 5. 打印二叉排序树 二叉排序树的打印可以使用中序遍历来实现,以下是一个示例代码: ```python def inorder_traversal(root): if not root: return [] res = [] stack = [] while root or stack: while root: stack.append(root) root = root.left root = stack.pop() res.append(root.val) root = root.right return res ``` 可以使用以上函数来打印二叉排序树的所有节点值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值