1、平衡二叉树:或者是一棵空的二叉排序树,或者是具有下列性质的二叉排序树:
⑴ 根结点的左子树和右子树的深度最多相差1;
⑵ 根结点的左子树和右子树也都是平衡二叉树。
平衡因子:结点的平衡因子是该结点的左子树的深度与右子树的深度之差。
在平衡树中,结点的平衡因子可以是1,0,-1。
最小不平衡子树:在平衡二叉树的构造过程中,以距离插入结点最近的、且平衡因子的绝对值大于1的结点为根的子树。
构造时,边构造边检查。
2、
设结点A为最小不平衡子树的根结点,对该子树进行平衡调整归纳起来有以下四种情况:
- LL型
- RR型
- LR型
- RL型
LL型:
B=A->lchild;
A->lchild=B->rchild;
B->rchild=A;
A->bf=0; B->bf=0;
if (FA==NULL) root=B;
else if(A==FA->lchild) FA->lchild=B;
else FA->rchild=B;
RR型:
B=A->rchild;
A->rchild=B->lchild;
B->lchild=A;
A->bf=0; B->bf=0;
if (FA==NULL)
root=B;
else if (A==FA->lchild)
FA->lchild=B;
else
FA->rchild=B;
LR型:
B=A->lchild;C=B->rchild;
B->rchild=C->lchild;
A->lchild=C->rchild;
C->lchild=B; C->rchild=A;
RL型:
B=A->rchild; C=B->lchild;
B->lchild=C->rchild;
A->rchild=C->lchild;
C->lchild=A; C->rchild=B;
综上所述, 在一个平衡二叉排序树上插入一个新结点S时,主要包括以下三步:
(1) 查找应插位置, 同时记录离插入位置最近的可能失衡结点A(A的平衡因子不等于0)。
(2) 插入新结点S, 并修改从A到S路径上各结点的平衡因子。
(3) 根据A、 B的平衡因子, 判断是否失衡以及失衡类型, 并做相应处理。
3、散列表的查找技术
散列函数的构造:
直接定址法:H(key) = a * key + b (a,b为常数)
除留余数法:H(key)=key mod p (p为小于或等于表长(最好接近表长)的最小素数)
数字分析法:事先知道关键码的分布,关键码的分布均匀
平方取中法:事先不知道关键码的分布且关键码的位数不是很大。
折叠法(分段叠加法):关键码位数很多,事先不知道关键码的分布。
冲突处理方法:
①开放定址法(闭散列方法):
用开放定址法处理冲突得到的散列表叫闭散列表。
如何寻找下一个空的散列地址?
(1)线性探测法
Hi=(H(key)+di) % m (di=1,2,…,m-1)
int HashSearch1(int ht[ ], int m, int k)
{
j=H(k);
if (ht[j]==k) return j; //没有发生冲突,比较一次查找成功
i=(j+1) % m;
while (ht[i]!=Empty && i!=j)
{
if (ht[i]==k) return i; //发生冲突,比较若干次查找成功
i=(i+1) % m; //向后探测一个位置
}
if (i==j) throw "溢出";
else ht[i]=k; //查找不成功时插入
}
(2)二次探测法:Hi=(H(key)+di)% m
(di=12,-12,22,-22,…,q2,-q2且q≤m/2)
(3)随机探测法:Hi=(H(key)+di)% m
(di是一个随机数列,i=1,2,……,m-1)
(4)再hash法
②链地址法(拉链法、开散列方法)
用拉链法处理冲突构造的散列表叫做开散列表。
Node<int> *HashSearch2(Node<int> *ht[ ], int m, int k)
{
j=H(k);
p=ht[j];
while (p && p->data!=k)
p=p->next;
if (p->data= =k) return p;
else {
q=new Node<int>; q->data=k;
q->next= ht[j];
ht[j]=q;
}
}
③建立公共溢出区
散列表包含基本表和溢出表(顺序存放)两部分(通常溢出表和基本表的大小相同)
- 散列的基本思想:在记录的存储地址和它的关键码之间建立一个确定的对应关系。这样,不经过比较,一次读取就能得到所查元素的查找方法。
- 散列表:采用散列技术将记录存储在一块连续的存储空间中,这块连续的存储空间称为散列表。
- 散列函数:将关键码映射为散列表中适当存储位置的函数。
- 散列地址:由散列函数所得的存储位置址 。
- 散列既是一种查找技术,也是一种存储技术。