树表的查找
当表插入或删除操作频繁时,为维护表的有序性,需要移动表中很多记录
需要改用动态查找表------几种特殊的树
动态查找表:表结构在查找过程中动态生成
对于给定值key,若表中存在,则成功返回,否则,插入关键字等于key的记录
几种特殊的树:
二叉排序树
平衡二叉树
红黑树
b-树
b+树
键树
(一). 二叉排序树
二叉排序树又称二叉搜索树,二叉查找树
二叉排序树或是空树,或是满足如下性质的二叉树:
1. 若其左子树非空,则左子树上所有结点的均小于根结点的值;
2. 若其右子树非空,则右子树上所有结点的值均大于等于根结点的值;
3. 其左右子树本身又各是一棵二叉排序树;
若中序遍历非空的二叉排序树,会得到一个按关键字排列的递增有序的序列
二叉排序树的操作------查找
算法思想:(递归查找)
设给定查找的值key,从指定的二叉排序树的根结点开始查找:
1. 若二叉排序树为空,则查找失败,返回空指针;
2. 若key等于根结点,则成功;
否则:
若小于根结点,则查找其左子树;
若大于根结点,则查找其右子树;
在左右子树上的操作类似;
二叉排序树的查找分析
二叉排序树上查找某关键字等于给定值的结点过程,其实就是走了一条从根到该结点的路径;
二叉排序树在查找时的次数,取决于查找的关键字在树中的层次;
最坏情况: 二叉排序树形态不均衡: 二叉排序树的深度 = 关键字个数
对于含有n个结点的二叉排序树的平均查找长度和树的形态有关
最好情况: 二叉排序树形态比较均衡,与折半查找中的判定树相同O(logn)
二叉排序树的操作------插入
若二叉排序树为空,则插入结点作为根结点插入到空树中
否则,继续在其左右子树上查找:
树中已有,不再插入;
树中没有:
查找直至某个叶子结点的左子树或右子树为空为止,则插入结点应为该叶子结点的左孩子或右孩子
插入的元素一定在叶子结点上
二叉排序树的操作------生成
从空树出发,经过一系列的查找和插入操作之后,可生成一棵二叉排序树
一个无序序列可通过构造二叉排序树而变成一个有序序列.构造的过程就是对无序序列进行排序的过程.
插入的结点均为叶子结点,故无需移动其他结点.相当于在有序序列上插入记录而无需移动其他记录.
二叉排序树的操作------删除
从二叉排序树中删除一个结点,不能把以该结点为根的子树都删去,只能删掉该结点,并且:还应保证删除后得到的二叉排序树仍然满足二叉排序树的性质不变.
由于中序遍历二叉排序树可以得到一个递增有序的序列.那么,在二叉排序树中删去一个结点相当于删去有序序列中的一个结点.
1. 将因删除结点而断开的二叉链表重新链接起来
2. 反之重新链接后树的高度增加
删除结点的情况分三种:
1. 被删除的结点是叶子结点:直接删去该结点
2. 被删除的结点只有左子树或者只有右子树,用其左子树或者右子树替换它(结点替换).其双亲结点的相应指针域的值改为"指向被删除结点的左子树或右子树"
3. 被删除的结点既有左子树,也有右子树
· 以其中序前驱的值将其替换,然后再删除该前驱.(前驱是左子树中最大的结点)
· 也可以用其后继替换之,然后再删除该后继(后继是右子树中最小的结点)
做"平衡化"处理,即尽量让二叉树的形态均衡!------平衡二叉树
(二). 平衡二叉树
平衡二叉树
又称AVL树
一棵平衡二叉树或者是空树,或者是具有下列性质的二叉排序树:
左子树与右子树的高度之差的绝对值小于等于1
左子树和右子树也是平衡二叉排序树
平衡因子
为了方便起见,给每个结点附加一个数字,给出该结点左子树与右子树的高度差.这个数字称为该结点的平衡因子(BF)
平衡因子 = 结点左子树的高度 - 结点右子树的高度
根据平衡二叉树的定义,平衡因子只能是-1,0,1
对于一棵有n个结点的AVL树,其高度保持在O(logn)数量级,ASL也保持在O(logn)量级
失衡二叉排序树的分析与调整
当我们在一个平衡二叉树上插入一个结点时,有可能导致失衡,即出现平衡因子绝对值大于1的结点,如-2,2
如果在一棵AVL树中插入一个新结点后造成失衡,则必须重新调整树的结构,使之恢复平衡;
平衡调整的四种类型:
LL型
LR型
RL型
RR型
调整共同原则:
降低高度
保持二叉排序树的性质