数据结构-----二叉搜索树-查找、插入、删除

#2017-12-12  2:00

#武汉工程大学邮电与信息工程学院邮科院校区

#软件工程1604谷子毅

提示:如果文中链接失效或有疑惑,请留言,我会在看到的第一时间帮助解决,谢谢支持!

二叉搜索树
也叫二叉排序树或二叉查找树

一颗二叉树,可以为空;如果不空,满足以下性质: 
1.非空左子树的所有键值小于根节点
2.非空左子树的所有键值小于根节点
3.左右子树都是二叉搜索数  

部分函数:
1.查找元素X,返回地址 
2.查找最小元素,返回地址 
3.查找最大元素,返回地址 
4.插入
5.删除

/*查找
查找从根结点开始,如果树空,返回NULL
若非空,根结点与X比较,进行不同处理
		1.X小于,只需左边继续搜索
		2.X大于,只需右边继续搜索
  	3.X等于,返回结点指针 */ 

/*递归方法*/
Position Find(ElementType X,BinTree BST){
	if(!BST) 
		return NULL;
	if(X>BST->Data)
		return Find(X,BST->Right);
	else if(X<BST->Data)
		return Find(X,BST->Left);
	else(X==BST->Data)
		return BST;
} 

/*非递归方法: 效率决定于树的高度*/ 
Position Find(ElementType X,BinTree BST){
	while(BST){
		if(X<BST->Data)	
			BST=BST->Left;
		else if(X>BST->Data)
			BST=BST->Right;
		else
			return BST
	}
	return NULL;
}

/*查找最大,最小元素*/ 
//		最大元素一定在树的最右分枝的端结点 
//		最小元素一定在树的最左分枝的端结点 

/*查找最小元素递归法*/
Position FindMin(BinTree BST){
	if(!BST) return NULL;
	else if(!BST->Left)
		return BST;
	else
		FindMin(BST->Left);
}

/*查找最大元素非递归法*/
Position FindMax(BinTree BST){
	if(BST)
		while(BST->Right)
			BST=BST->Right;
	return BST;
} 

/*二叉搜索树的插入*/
//关键是要找到元素应该插入的位置
//可以采用与Find类似的方法
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;
}

/*二叉搜索树的删除*/
//考虑三种情况:
//	  删除的是叶结点:直接删除,再改父指针置为 NULL 
//	  删除的结点有一个孩子:父结点指向要删除的结点的孩子 
//	  删除的结点有两个子树: 用右子树的最小元素或
//	  者左子树的最大元素替代被删除结点 
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;
} 
    原文作者:二叉查找树
    原文地址: https://blog.csdn.net/qq_41092262/article/details/78778297
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞