第九章 查找教程.ppt

典型的关键字类型说明: Typedef float KeyType; //实型 Typedef int KeyType; //整型 Typedef char *KeyType; //字符串型 数据元素类型定义为: Typedef struct{ KeyType key;//关键字域 … }SElemType; 9.1 静态查找表 ADT StaticSearchTable{ 数据对象 D:D是具有相同特性的数 据元素的集合。 数据关系R:数据元素同属于一个集合。 基本操作: Create(ST,n); Destroy(ST); Search(ST, key); Traverse(ST,Visit()); } ADT StaticSearchtable 三、分块查找(索引顺序查找) 小结:三种查找方法比较 45 12 8 57 60 20 11 59 50 3 假设在二叉树上被删除的结点为*p,其双亲结点为*f,且不失一般性,可设*p是*f的左孩子。下面分三种情况来讨论: 二、B-树和B+树 1、B-树的定义 一棵m阶的B-树,或为空树或为满足下列特性的m叉树: (1)每个结点至多有m棵子树; (2)如根结点不是叶,至少有两棵子树; (3)除根之外,所有非终端结点至少有┌m/2 ┐棵子树 ; (4)所有的非终端结点含有信息 (n,A0,K1,A1,K2,······,Kn,An) (5)所有叶结点都在同一层次 ,叫做失败结点。 所有的非终端结点含有信息 n : 有n+1棵子树, K1≤K2≤······≤Kn 关键字有序序列, 指针Ai-1指向子树中结点的关键字小于Ki, 2、 m阶B-树的插入 从底层根据值的大小增加一个关键字: (1)结点中的关键字不超过m-1时完成。 (2)结点中的关键字等于m时,将该结点分成左右两个结点,中间一个关键字上升至双亲结点。 (3)重复(2)直至根结点。 45 12 57 8 20 60 3 11 59 50 在一棵二叉排序树中插入一个结点可以用一个递归的过程实现,即:若二叉排序树为空,则新结点作为二叉排序树的根结点;否则,若给定结点的关键字值小于根结点关键字值,则插入在左子树上;若给定结点的关键字值大于根结点的值,则插入在右子树上。 2、二叉搜索树的插入过程 3、二叉搜索树的删除过程 下面分四种情况讨论一下如何确保从二叉树中删除一个结点后,不会影响二叉排序树的性质: (1)若要删除的结点为叶子结点,可以直接进行删除。 (2)若要删除结点有右子树,但无左子树,可用其右子树的根结点取代要删除结点。 (3)若要删除结点有左子树,但无右子树,可用其左子树的根结点取代要删除结点,与步骤(2)类似。 (4)若要删除结点的左右子树均非空,则首先找到要删除结点的右子树中关键字值最小的结点(即子树中最左结点),利用上面的方法将该结点从右子树中删除,并用它取代要删除结点的位置,这样处理的结果一定能够保证删除结点后二叉树的性质不变。 45 12 57 20 60 59 50 (1)*p为叶子结点:f-Lchild=NULL即可。 (2)*p结点只有左子树PL或者只有右子树PR 15 此时只要令PL或PR直接成为其双亲的左子树即可。 (3)若 *p结点有左子树和右子树,用其左子树中最后被遍历的结点SL或右子树中第一个被遍历结点SR去替换*p,再去删除SL或SR。 4、二叉排序树的查找分析 在二叉排序树上查找其关键字等于给定值的结点的过程,恰好是走了一条从根结点到该结点的路径的过程,和给定值比较的关键字个数等于路径长度加1,因此,和折半查找类似,与给定值比较的关键字个数不超过树的深度。然而,折半查找长度为N的表的判定树是惟一的,而含有N个结点的二叉排序树却不惟一。见P231页的图10。因此,含有N个结点的二叉排序树的平均查找长度和树的形态有关。显然最好的情况是二叉排序树的形态和折半查找的判定树相同,最坏的情况是构成的二叉排序树为单支树。从P232的推论中可知,在随机的情况下,二叉排序树的平均查找长度和LOGN是等量级的。 45 93 53 28 53 45 24 93 12 28 24 12 (a) (b) 图9.10 不同形态的二叉排序树 5、平衡二叉树 又称为AVL树。它或者是一

文档评论(0)

1亿VIP精品文档

相关文档