二叉搜索树:一颗二叉树,可以为空;如果不为空,满足以下性质:
1、非空左子树的所有键值小于其根节点的键值。
2、非空右子树的所有键值大雨其根节点的键值。
3、左、右子树都是二叉搜索树。
Position Find(ElementType X,BinTree BST):从二叉搜索树BST中查找元素X,返回其所在结点的地址;
Posittion FindMin(BinTree BST):从二叉搜索树BST中查找并返回最小元素所在结点的地址;
Position FindMax(BinTree BST):从二叉搜索树BST中查找并返回最大元素所在结点的地址。
BinTree insert(ElementType X,BinTree BST)
BinTree Delete(ElementType X,BinTree BST)
二叉搜索树的查找操作:Find
查找从根节点开始,如果树为空,返回NULL
若搜索树非空,则根据结点关键字和X进行比较,并进行不同处理:
1、若X小于根节点键值,只需在左子树中继续搜索;
2、如果X大于根节点的键值,在右子树中进行继续搜索;
3、若两者比较结果是相等,搜索完成,返回指向此结点的指针。
//尾递归
Position Find(ElementType X,BinTree BST)
{
if(!BST)return NTLL; //查找失败
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;
}
//迭代函数
Posiition IterFind(ElementType X,BinTree BST)
{
while(BST)
{
if(X>BST->Data)
BST=BST->Right; //向右子树中移动,继续查找
else if(X->BST->Left); //向左子树中移动,继续查找
BST=BST->Left;
else
return BST; //查找成功,返回结点的找到结点的地址
}
return NULL; //查找失败
}
查找最大和最小元素
最大元素一定是在树的最右分支的端接点上,最小元素一定是在树的最左分支的端接点
//查找最小元素的递归函数
Position FindMin(BinTree BST)
{
if(!BST)return NULL; //空的二叉搜索树,返回NULL
else if(!BST->Left)
return BST; //找到最左叶节点并返回
else
return 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 TreeNoe));
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;要删除的结点只有一个孩子结点,将其父节点的指针指向要删除结点的孩子结点;要删除的结点有左、右两棵子树,用另一结点替代被删除结点:右子树的最小元素或者左子树的最大元素。
平衡因子(Balance Factor,简称BF):BF(T)=HL-HR,其中HL和HR分别为T的左、右子树的高度。平衡二叉树(Balanced Binary Tree)(AVL树)空树,或者任一结点左、右子树高度差的绝对值不超过1,既|BF(T)<=1。
平衡二叉树的调整