#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;
}