二叉搜索树的插入和删除

本文介绍了一种实现二叉搜索树插入和删除节点的算法。通过递归方式定位插入位置,并处理了多种删除场景:包括删除无子节点、单子节点及双子节点的情况。对于双子节点情况采用右子树最小元素替代后再删除该最小元素的方法。

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



typedef struct TreeNode *BinTree;  
typedef BinTree Position;   
struct TreeNode{  
    ElementType Data;  
    BinTree Left;  
    BinTree Right;   
};   
BinTree BST; 
BinTree Insert(ElementType X,BinTree BST)//二叉搜索树的插入算法
{
	if(!BST){//若原树为空,生成并返回一个结点的二叉搜索树
		BST=malloc(sizeof(struct TreeNode));
		BST->Data=X;
		BST->Left=BST->Right=NULL;	
	}else//开始找要插入元素的位置
		if(X<BST->Data)
			BST->Left=Insert(X,BST->Left);//递归插入左子树
		else if(X>BST->Data)
			BST->Right=Insert(X,BST->Right);//递归插入右子树	 
	 	//else X已经存在,什么都不做
	return BST; 
}
BinTree Delete(ElementType X,BinTree BST)//二叉搜索树的删除算法
{
	Position Tmp;
	if(!BST) printf("要删除的元素未找到");
	else if(X<BST->Data)
			BST->Left=Delete(X,BST->Left);//左子树递归删除
	else if(X>BST->Data)
			BST->Right=Delete(X,BST->Right);//右子树递归删除
	else//找到要删除的结点
		 if(BST->Left&&BST->Right){//被删除结点有左右两个结点
		 	Tmp=FindMin(BST->Right);
			 		//在右子树中找最小的元素填充删除结点
			BST->Data=Tmp->Data;
			BST->Right=Delete(BST->Data,BST->Right);
					//在删除结点的右子树中删除最小元素 
		 }else{//被删除结点有一个或无子结点
		 	Tmp=BST;
			if(!BST->Left)//有右孩子或无子结点
				BST=BST->Right;
			else if(!BST->Right)//有左孩子或无子结点
				BST=BST->Left;
			free(Tmp); 
		 }
	return BST;  
} 


二叉搜索树: 二叉搜索树是一种特殊的二叉树,它的左子树中所有节点的值都小于它的根节点的值,而右子树中所有节点的值都大于它的根节点的值。二叉搜索树支持快速的插入、查找删除操作,时间复杂度为O(logn)。 插入删除: 插入操作是将一个新节点插入二叉搜索树中,找到对应的位置并插入即可。删除操作比插入操作复杂一些,需要考虑到删除节点后二叉搜索树的结构是否仍然满足二叉搜索树的性质。如果需要删除的节点是叶子节点,直接删除即可。如果需要删除的节点只有一个子节点,可以将其子节点上移,删除该节点。如果需要删除的节点有两个子节点,可以找到该节点右子树中最小的节点,将其值复制到需要删除的节点中,然后删除该最小节点。 树遍历: 树的遍历是指按照某种顺序依次访问树中的所有节点。常用的树遍历方式有前序遍历、中序遍历后序遍历。前序遍历是先访问根节点,然后访问左子树右子树;中序遍历是先访问左子树,然后访问根节点右子树;后序遍历是先访问左子树右子树,然后访问根节点。 AVL树: AVL树是一种自平衡二叉搜索树,它保证了树的任意节点的左右子树高度差不超过1。当插入删除节点时,AVL树会通过旋转操作来保持树的平衡。AVL树的查找、插入删除操作的时间复杂度均为O(logn)。 红黑树: 红黑树也是一种自平衡二叉搜索树,它的插入删除操作比AVL树更快,但查找操作稍慢一些。红黑树通过染色旋转操作来保持树的平衡,它要求树中任意一条从根到叶子的路径上,红色节点黑色节点的个数相同。红黑树的时间复杂度也为O(logn)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值