赞
踩
书接上回。
上回我们说到了二叉排序树的基本特性,那么根据二叉排序树的基本特性,可以容易得出其查找算法:若待查元素大于结点,则在其右子树上继续查找,反之,则在左子树上继续查找,知道找到或者结点的左(右)结点为空。
在二叉排序树中插入新结点,只要保证插入后仍符合二叉排序树的定义即可。二叉树的插入过程为:若二叉排序树为空,则将元素插入为新的根结点,否则继续在其左子树或右子树上查找,直至某个结点的左子树或右子树为空为止,元素作为该结点的左孩子或右孩子插入。
那么,和插入相反的是,删除是在查找成功之后才进行的,要求在删除二叉排序树上某个结点之后,仍然保持二叉排序树的特性,也就是说,在二叉排序树中删除一个结点相当于删除有序序列中的一个结点。
删除有三种情况:
1、被删除的结点是叶子结点:直接删除
2、被删除的结点只有左子树或右子树:将该结点删除并将其子树连接在其父节点上
3、被删除的结点既有左子树又有右子树:查找该结点的前驱或后继结点,将待删除结点应用前驱或后继结点覆盖,然后删除其前驱或后继结点。
就平均性能而言,二叉排序树上的查找和折半查找相差不大,并且二叉排序树上的插入和删除结点十分方便,无需移动大量结点。因此,对于经常需要做插入、删除和查找运算的序列,宜采用二叉排序树结构。由此,二叉排序树也称二叉查找树。
针对于二叉树来说,有树的高度和深度。
树的深度:从根结点开始(根结点深度为0)自顶向下逐层累加的
树的高度:从叶子结点开始(叶子节点高度为0)自底向上逐层累加的。在计算高度的时候,根结点要计算最大的高度。
二叉平衡树或者是一棵空树,或者是具有如下特性的二叉树:
插入某一结点后,可能会造成树的部分失衡,因此就引出了最小不平衡子树的概念。最小不平衡子树就是指:以距离插入结点最近的、且平衡因子的绝对值大于1的结点为根的子树。
对不平衡子树的调整方法有四种:LL、RR、LR、RL
LL型:将不平衡结点和它的后继结点(造成不平衡的结点)顺时针的方向旋转,且将造成不平衡结点的右孩子作为自己的左孩子。
RR型:将不平衡结点和它的右子树逆时针旋转,并将右子树的左孩子作为自己的右孩子
LR型:先将造成不平衡的两结点逆时针旋转,再和不平衡结点顺时针旋转
RL型:先将造成不平衡的两结点逆时针旋转,再和不平衡结点逆时针旋转
为了方便记忆,我们不妨假设L代表逆时针旋转,R代表顺时针旋转。那么LL则为顺时针旋转(负负得正,逆逆为顺),RR为逆时针。LR为先逆时针,再顺时针。RL为先顺时针,再逆时针。
那么,如何构造一棵平衡二叉树呢?构造平衡二叉树的过程就是从空的二叉树开始,不断执行插入操作,当某结点插入平衡二叉树时引起不平衡,则进行相应的调整。
散列技术:在元素和关键码之间建立一个确定的对应关系H,使得每个关键码key和唯一的一个存储位置(即散列值)H(key)对应。采用散列技术将记录存储在一块连续的存储空间中,就是散列表。这种对应关系就叫做散列函数。
从理论上来讲,散列查找是查找速度最快的查找方法。
散列函数设计
散列函数的设计方法主要有以下几种方法:
1、直接定址法:H(key) = a * key + b
这种方法计算简单,没有冲突,适合于关键码分布比较连续的情况,否则空间浪费较多。
2、除留余数法:H(key) = key % p (p <= m)
除留余数法的基本思想是:选择某个适当的正整数p,以关键码除以p的余数作为散列地址。其中m为散列表的长度,p为小于或等于散列表长度m的某个最大素数。(p的选取要避免key值的冲突)
3、数字分析法:假设关键码集合中的每个关键码都是由S位数字组成(u1,u2,…,us),分析每位数字的分布情况,从中提取分布均匀的若干位或它们的组合作为地址。这种方法适合于所有关键码已知,并对每一位的取值分布有所分析的情况。
4、平方取中法
5、折叠法
上面基本上就把查找的内容整理完了。
接下来讲一讲排序。
排序的主要目的是便于查找。排序算法 基本上基于顺序表而设计的。
1、插入排序。
基本方法是寻找一个指定元素在待排序元素中的位置,然后插入。最简单的插入算法是直接插入排序。
2、交换排序(元素交换一次,相当于移动三次)
交换排序的基本方法是 在待排序元素中选择两个元素,将它们的关键码进行比较,如果反序列则交换它们的位置,知道没有反序列为止。
根据上面的描述,我们可以知道快速排序需要解决三个问题:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。