二叉查找树
二叉查找树(BinarySearch Tree,也叫二叉搜索树,或称二叉排序树Binary Sort Tree)或者是一棵空树,或者是具有下列性质的二叉树:
(1)、若它的左子树不为空,则左子树上所有结点的值均小于它的根结点的值;
(2)、若它的右子树不为空,则右子树上所有结点的值均大于它的根结点的值;
(3)、它的左、右子树也分别为二叉查找树。
基本操作:
//============================================
//二叉搜索树的递归查找函数
Position Find(BinTree BST, int X){
if(!BST)
return NULL;
else{
if(X > BST->Data)
return Find(BST->Right, X);
else if(X < BST->Data)
return Find(BST->Left, X);
else
return BST;
}
}
//---------------------------------------------
//二叉搜索树的迭代查找函数
Position IterFind(BinTree BST, int X){
while(!BST){
if(X < BST->Data)
BST = BST->Left;
else if(X > BST->Data)
BST = BST->Right;
else
return BST->Data;
}
return NULL;
}
//=============================================
//二叉搜索树:查找最小元素的递归函数
Position FindMin(BinTree BST){
if(!BST)
return NULL;
else{
if(!BST->Left)
return BST;
else
return FindMin(BST->Left);
}
}
//----------------------------------------------
//二叉搜索树:查找最小元素的迭代函数
Position IterFindMin(BinTree BST){
if(!BST)
return NULL;
else{
while(BST->Left)
BST = BST->Left;
return BST;
}
}
//-----------------------------------------------
//二叉搜索树:查找最大元素的递归函数
Position FindMax(BinTree BST){
if(!BST)
return NULL;
else{
if(!BST->Right)
return BST;
else
return FindMax(BST->Right);
}
}
//------------------------------------------------
//二叉搜索树:查找最大元素的迭代函数
Position IterFindMax(BinTree BST){
if(!BST)
return NULL;
else{
while(BST->Right)
BST = BST->Right;
return BST;
}
}
//=================================================
//二叉搜索树的插入
BinTree Insert(BinTree BST, int X){
if(!BST){ //若为空,直接赋值一个新结点
BST = (BinTree)malloc(sizeof(BinTree));
BST->Data = X;
BST->Left = BST->Right = NULL;
}
else{ //
if(X > BST->Data)
BST->Right = Insert(BST->Right, X);
else if(X < BST->Data)
BST->Left = Insert(BST->Left, X);
}
return BST;
}
//==================================================
//二叉搜索树的删除
BinTree Delete(BinTree BST, int X){
if(!BST)
printf("ERROR!");
else if(X < BST->Data)
BST->Left = Delete(BST->Left, X);//左子树递归删除
else if(X > BST->Data)
BST->Right = Delete(BST->Right, X);//右子树递归删除
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被赋值为NULL
BST = BST->Left;
free(Tmp);
}
}
return BST;
}
//=========================================================