第10章 字典

字典的定义

有序字典是以有序集为基础的抽象数据类型
它支持以下运算:
(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的右子树

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值