字典的定义
有序字典是以有序集为基础的抽象数据类型
它支持以下运算:
(1)Member(x,S),成员运算。
(2)Insert(x),插入运算:将元素x插入集合。
(3)Delete(x),删除运算:将元素x从当前集合中删去。
(4)Predecessor(x),前驱运算:返回集合中小于x的最大元素。
(5)Successor(x),后继运算:返回集合中大于x的最小元素。
(6)Range(x,y),区间查询运算:返回集合中界于x和y之间,即x≤z≤y的所有元素z组成的集合。
(7)Min(S),最小元运算:返回当前集合中依线性序最小的元素。
用二叉搜索树实现字典(二叉排序树)
对二叉排序树进行中序遍历可以得到一个递增的有序序列
在二叉搜索树T表示的字典中搜索元素x的运算实现
btlink BSSearch(TreeItem x, BinaryTree T)
{
btlink p = T->root;
while (p)
if (x < p->element) p = p->LeftChild;
else if (x > p->element) p = p->RightChild;
else break;
return p;
}
//成员查询函数Member(x,T)只要返回BSSearch(x, T)搜索的结果
二叉搜索树的建立过程—插入运算的实现
int BST_Insert(BiTree &T,KeyType k){
//在二叉排序树T中插入一个关键字为k的结点
if(T==NULL){//原树为空,新插入的记录为根结点
T=(BiTree)malloc(sizeof(BSTNode));
T->key=k;
T->1child=T->rhild=NULL;
return 1;//返回1,表示成功
}
else if(k==T->key)//树中存在相同关键字的结点
return 0;
else if(k<T->key)//插入到T的左子树中
return BST Insert(T->lchild,k);
else//插入到T的右子树中
return BST Insert(T->rchild,k);
}
二叉搜索树删除运算的实现
平衡二叉树AVL树
如果插入或者删除一个结点时导致了平衡二叉树不平衡,则先找到插入路径上离插入结点最近的平衡因子的绝对值大于1的结点A,再对以A为根的子树,在保持二叉排序树的前提下,调整各结点的位置关系,使之重新达到平衡注意:
每次调整的对象都是最小不平衡子树,即在插入路径上离插入结点最近的平衡因子绝对值大于1的结点作为根的子树
一般可以将失去平衡后进行调整的规律归纳为下列4种情况:1) LL平衡旋转(右单旋转):
当在结点A的左孩子结点B的左子树上插入了结点导致不平衡,则将B作为A的根结点,A作为B的右孩子,而B的原右子树作为A的左子树2) RR平衡旋转(左单旋转):
当在A的右孩子结点B的右子树上插入了结点导致不平衡,则将B作为A的根结点,A作为B的左孩子,而B的左子树作为A的右子树3) LR平衡旋转(先左后右双旋转):
当在A的左孩子结点B的右子树上插入了结点导致不平衡,则将B的右子树的根结点C向左上旋转提升到B结点的位置,并且C的左孩子变成B的右孩子,然后将结点C向右上旋转提升到结点A的位置,并且结点C的右孩子变成A的左孩子4) RL平衡旋转(先右后左双旋转):
当在A的右孩子结点B的左子树上插入了结点导致不平衡时,将结点B的左孩子结点C旋转到B的位置,B变成C的右孩子,并且C的右子树变成B的左子树,然后将C旋转到A的位置,A变成C的左子树,并且C的左子树变成A的右子树