《数据结构——C语言描述》第8章:查找

合集下载

数据结构课件第八章查找优秀课件

数据结构课件第八章查找优秀课件

low
mid
high
1 2 3 4 5 6 7 8 9 10 11
5 13 19 21 37 56 64 75 80 88 92
low mid high 1 2 3 4 5 6 7 8 9 10 11 5 13 19 21 37 56 64 75 80 88 92
查找第i个元素: n+1-i
查找失败:
n+1
iii 比较次数=5
顺序查找方法的ASL
n
对含 n个 有记录的 AS表 L , pici i1
设表中每个元 概素 率的 相 pi查 等 1n找
n
则AS L
i1
pici
1 n i ni1
1n(n1) n2
n1 2
7.2.2 折半查找
1. 折半查找的基本思想 折半查找要求查找表用顺序存储结构存放且各数 据元素按关键字有序(升序或降序)排列,也就是说 折半查找只适用于对有序顺序表进行查找。
查找——也叫检索,是根据给定的某个值,在表中确定一 个关键字等于给定值的记录或数据元素
关键字——是数据元素中某个数据项的值,它可以标识一 个数据元素
查找方法评价
查找速度
占用存储空间多少
算法本身复杂程度
平均查找长度ASL(Average Search Length):为确定记 录在表中的位置,需和给定值进行比较的关键字的个 数的期望值叫查找算法的~
7.2 静态查找
正如本章第一节所述:静态查找是指在静态查找 表上进行的查找操作,在查找表中查找满足条件的数 据元素的存储位置或各种属性。本节将讨论以线性结 构表示的静态查找表及相应的查找算法。
7.2.1 顺序查找
1. 顺序查找的基本思想

数据结构-查找

数据结构-查找
等,Ci为查找第i个元素所用到的比较次数。
8.2.1 顺序查找
8.2 线性表的查找
1.顺序查找的基本思想
顺序查找是一种最简单的查找方法,它的基本思想是: 从表的一端开始,顺序扫描线性表,依次将扫描到的结点关 键字和待找的值K相比较,若相等,则查找成功,若整个表 扫描完毕,仍末找到关键字等于K的元素,则查找失败。
if (array[mid].key>k)
hig=mid-1;
//在左子区间中查找
else low=mid+1; }
//在右子区间中查找
return(-1); }
//查找失败
例如,假设给定有序表中关键字为 05,13,19,21,37,56,64,74,80,88,92 将 查 找 K=21 和 K=85 的 情况描述为图8-1及图8-2形式。
顺序查找既适用于顺序表,也适用于链表。若用顺序表, 查找可从前往后扫描,也可从后往前扫描,但若采用单链表, 则只能从前往后扫描。另外,顺序查找的表中元素可以是无 序的。
下面以顺序表的形式来描述算法。
2.顺序查找算法实现
struct node
{ …;
int key;
//key为关键字,类型设定为整型
例如,要找关键字为k的元素,则只需求出函数值H(k), H(k)为给定的哈希函数,代表关键字k在存贮区中的地址, 而存贮区为一块连续的内存单元,可用一个一维数组(或链表) 来表示。
例,假设有一批关键字序列18,75,60,43,54,90,46,给定哈希函 数H(k)=k%13,存贮区的内存地址从0到15,则可以得到每 个关键字的散列地址为:
typedef struct
{ int key;
…;
} NODE;

C语言数据结构:查找

C语言数据结构:查找
➢ 8.1 基本概念与术语 ➢ 8.2 静态查找表 ➢ 8.3 动态查找表 ➢ 8.4 哈希表查找 ➢ 8.5 小结与习题
2020年8月20日
1
本章主要内容
• 本章主要学习静态查找和动态查找方法。静态查
找包括顺序查找、二分查找和分块索引查找等, 动态查找包括二叉排序树、B树等。作为重点内 容本章还介绍了哈希查找及相关知识。
主关键字将能唯一确定一个数据元素(或记录) 的关键字。
查找表是由具有相同类型的数据元素(或记录) 组成的集合。分为静态查找表和动态查找表两大类。
如果查找表中能够找到满足条件的记录,称为查 找成功,否则称为查找不成功。
2020年8月20日
3
静态查找表:在对查找表进行操作时,不改变 表的结构,只进行查找操作;
找成功时
n
ASL= ∑ Pi*Ci
i=1
Pi为表中第i个数据元素的查找概率,Ci为表中
第i个数据元素的关键字与给定值x相等时,需要比较
的次数。
设查找表长度为n,查找元素x和表中第i个元素关
键字相等时,需要比较的次数为n-i+1,则平均查找
长度为:
n ASL= ∑ Pi*(n-i+1)
i=1
2020年8月20日
6 13 17 20 24 28 30 36 39 44 48 51 55
第一次 low=1
mቤተ መጻሕፍቲ ባይዱd=7
high=13
因x>30,下一步继续在右半区查找,即:
0 1 2 3 4 5 6 7 8 9 10 11 12 13
6 13 17 20 24 28 30 36 39 44 48 51 55
例在给定的序列A={6,13,17,20,24,28, 30,36,39,44,48,51,55}中查找给定值13和52 这两个数据。

数据结构第8章查找

数据结构第8章查找

动态查找表
1 二叉排序树和平衡二叉树 二叉排序树或者是一颗空树,或者是具 有如下性质的二叉树: (1)若它的左子树非空,则左子树上所有 结点的值均小于根结点的值; (2)若它的右子树非空,则右子树上所有 结点的值均大于根结点的值; (3)其左右子树也是一颗二叉排序树。
43
33
37 37 51 43 33 41 67 40 67
int SearchBin(Seqlist S ,KeyType t) { int mid,low=0,high=S.size-1; while(low<=high) { mid=(low+high)/2; if(t.key==S.list[mid].key) return mid; else if(t.key>S.list[mid].key) low=mid+1; else high=mid-1; } return -1; }
1 43
2
23
37
1
51
1
20
1
30
1
41
1
49
1
67
B-树上的结点可以含有m-1个关键字和m 个指针,查找过程:将数据元素关键字 和跟结点的若干个关键字逐个进行比较, 如果相等,则查找成功返回;否则,将 沿着指针继续查找下层结点。
B-树的生成从空树开始,逐个插入关键 字得到。 根据B-树的特点,其关键字的个数必须 至少为m /2-1,但又不能超过m-1。 每次插入时总是根据其大小在最底层某 个叶子结点上添加一个关键字,如果该 结点的关键字个数小于m-1,则直接插 入,如果发现新插入关键字后,关键字 总数超过m-1,则该结点必须分裂 。
二叉排序树的插入过程: 若二叉排序树非空,先将给定关键字和 根结点关键字进行比较,如果相等,则 停止插入操作并返回;否则,如果小于 根结点关键字,则在左子树上搜得合适 位置插入该元素;如果大于根结点关键 字,则在右子树上搜得合适位置插入该 元素。

数据结构之查找课件PPT课件

数据结构之查找课件PPT课件

索引表的定义
struct indexterm {
keytype key; int low, high; }; typedef struct indexterm index[MAXITEM]; 这里的keytype可以是任何相应的数据类型, 如int、float、或char等,在算法中,我们规 定keytype缺省是int类型。
int blksearch (sqlist r, index idx, int k, bn)
{
/*bn为块的个数*/
int i, j, mid, low=1, high=bn, find=0;
while (low<=high && !find)
{
➢ 顺序查找的优点是算法简单、适应面广,且 不要求表中数据有序。缺点是平均查找长度 较大,特别是当n较大时,查找效率较低, 不宜采用。
2.折半查找
➢ 折半查找又称二分查找(Birary search)。 ➢ 假设记录在查找表R[1…n]中按关键字排列有
序。首先用k与查找表中间元素的关键字比 较,。。。。。。
➢ 在实际应用问题中,每个记录一般包含 有多个数据域,查找是根据其中某一个 指定的域进行的,这个作为查找依据的 域称为关键字(key)。
➢ 顺序查找的线性表定义如下:
Typedef struct rectype {
keytype key; itemtype item1 …… }rectype;
➢ 比较结果有三种可能:
⑴ 如果r[m].key>k,说明如果存在欲查找的元素, 该元素一定在数组的前半部分,查找范围缩小了 一半,修改查找范围的的上界high=m-1,继续对 数组的前半部分进行二分查找;

数据结构chapter 8 查找.ppt

数据结构chapter 8 查找.ppt

21-Jan-20
20
二叉判定树
折半查找过程可以用一棵二叉树来表示。 树中的每个结点表示查找表中的一个记录 结点的值表示该记录在查找表中的位置 通常情况下称这个描述查找过程的二叉树为二叉判定树。
6
3 1
2
4 5
9 7
8
10 11
21-Jan-20
21
二叉判定树分析(查找成功)
由二叉判定树可见,成功查找结点的过程就是从根结点到树中某 个结点的路径,比较的次数是该结点在二叉判定树上的层次。
折半查找法在查找不成功时和给定值进行比较的次数最多为
log
n 2


1
6
3
9
1
4
7
10
-1
2
3-4
5
6-7
8
9-10
11
1-2
2-3
4-5
5-6
7-8
8-9
10-11
11-
21-Jan-20
23
折半查找的平均查找长度
假定有序表的长度为 n,n=2h-1,h为树的最大深度
由于第j层上的节点数目为 2j-1,这些节点只需要比较j 次
动态查找表的突出特征在于:表的内容本身就是在查 找过程中动态生成的。
对于给定的值key,如果在表中存在关键字等于key记 录,则查找成功,否则就插入关键字等于key的记录。
21-Jan-20
21-Jan-20
4
如何进行查找?
查找过程依赖于数据元素在查找表中的位置。 具体采用什么样的查找方法完全取决于查找表中数据
元素是根据何种关系来组织的。
21-Jan-20

《数据结构——C语言描述》习题及答案 耿国华

第1章绪论之老阳三干创作习题一、问答题1. 什么是数据结构?2. 四类基本数据结构的名称与含义。

3. 算法的定义与特性。

4. 算法的时间复杂度。

5. 数据类型的概念。

6. 线性结构与非线性结构的不同。

7. 面向对象程序设计语言的特点。

8. 在面向对象程序设计中,类的作用是什么?9. 参数传递的主要方式及特点。

10. 抽象数据类型的概念。

二、判断题1. 线性结构只能用顺序结构来存放,非线性结构只能用非顺序结构来存放。

2. 算法就是程序。

3. 在高级语言(如C、或 PASCAL)中,指针类型是原子类型。

三、计算下列程序段中X=X+1的语句频度for(i=1;i<=n;i++)for(j=1;j<=i;j++)for(k=1;k<=j;k++)x=x+1;[提示]:i=1时:1 = (1+1)×1/2 = (1+12)/2i=2时:1+2 = (1+2)×2/2 = (2+22)/2i=3时:1+2+3 = (1+3)×3/2 = (3+32)/2…i=n时:1+2+3+……+n = (1+n)×n/2 = (n+n2)/2f(n) = [ (1+2+3+……+n) + (12 + 22 + 32 + …… + n2 ) ]/ 2=[ (1+n)n/2 + n(n+1)(2n+1)/6 ] / 2=n(n+1)(n+2)/6=n3/6+n2/2+n/3区分语句频度和算法复杂度:O(f(n)) = O(n3)四、试编写算法求一元多项式Pn(x)=a0+a1x+a2x2+a3x3+…anxn的值Pn(x0),并确定算法中的每一语句的执行次数和整个算法的时间复杂度,要求时间复杂度尽可能的小,规定算法中不克不及使用求幂函数。

注意:本题中的输入ai(i=0,1,…,n), x和n,输出为Pn(x0).通常算法的输入和输出可采取下列两种方式之一:(1)通过参数表中的参数显式传递;(2)通过全局变量隐式传递。

数据结构(C语言版)教学指导:第8章 查找的分析与应用

散列函数中的除留余数法
教学难点
线性表的二分查找方法
二叉排序树的删除方法
散列函数中解决冲突的方法,包括开放地址法和拉链法
教学计划
教材章节
学习内容
课时分配
第8章8.1∽8.2
全部微课
微课8-1 查找的概念
学生自主
提前预习
微课8-2 顺序查找
微课8-3 二分法查找
微课8-4 分块查找
第8章8.1∽8.2
查找的基本概念
第8章8.4
全部微课
微课8-9 散列表的概念
学生自主
提前预习
微课8-10 散列函数的构造方法
微课8-11 散列技术开放定址解决冲突法
微课8-12 散的概念
2课时
散列函数的构造方法:除留余数法
散列函数处理冲突的方法,包括开放地址法和拉链法
备注
除软件技术专业以外,散列技术的相关知识可以选讲
2课时
线性表的顺序查找方法
线性表的二分查找方法
线性表的分块查找方法
第8章8.3
全部微课
微课8-5 二叉排序树的定义
学生自主
提前预习
微课8-6 二叉排序树的建立
微课8-7 二叉排序树的删除
微课8-8 二叉排序树的查找
第8章8.3
二叉排序树的定义
2课时
二叉排序树的插入和生成
二叉排序树的删除
二叉排序树的查找
理论课时
6课时
实践课时
2课时
教学方法
引导启发法、实例演示法
教学目标
了解查找的基本概念
熟练掌握线性表的顺序查找和二分查找方法
了解线性表的分块查找方法
掌握二叉排序树的定义、生成和删除方法

数据结构C语言版第八章 查找

第八章查找重点难点要求理解"查找表"的结构特点以及各种表示方法的适用性;熟练掌握顺序查找和折半查找的方法;熟悉描述折半查找过程的判定树的构造方法;熟练掌握二叉排序树的构造和查找方法;理解二叉平衡树的构造过程;理解B-和B+树的特点、基本操作和二者的区别。

熟练掌握哈希表的构造方法,深刻理解哈希表与其它结构的表的实质性的差别;掌握各种不同查找方法之间的区别和各自的适用情况,能按定义计算各种查找方法在等概率情况下查找成功时的平均查找长度。

典型例题1.若对具有n个元素的有序的顺序表和无序的顺序表分别进行顺序查找,试在下述两种情况下分别讨论两者在等概率时的平均查找长度:(1)查找不成功,即表中无关键字等于给定值K的记录;(2)查找成功,即表中有关键字等于给定值K的记录。

【解】查找不成功时,需进行n+1次比较才能确定查找失败。

因此平均查找长度为n+1,这时有序表和无序表是一样的。

查找成功时,平均查找长度为(n+1)/2,有序表和无序表也是一样的。

因为顺序查找与表的初始序列状态无关。

2.画出对长度为18的有序的顺序表进行二分查找的判定树,并指出在等概率时查找成功的平均查找长度,以及查找失败时所需的最多的关键字比较次数。

【解】等概率情况下,查找成功的平均查找长度为:ASL=(1+2*2+3*4+4*8+5*3)/18=3.556查找失败时,最多的关键字比较次树不超过判定树的深度,此处为5.3.为什么有序的单链表不能进行折半查找?【解】因为链表无法进行随机访问,如果要访问链表的中间结点,就必须先从头结点开始进行依次访问,这就要浪费很多时间,还不如进行顺序查找,而且,用链存储结构将无法判定二分的过程是否结束,因此无法用链表实现二分查找。

4.设二叉排序树中关键字互不相同,则其中最小元必无左孩子,最大元必无右孩子。

此命题是否正确?最小元和最大元一定是叶子吗?一个新结点总是插在二叉排序树的某叶子上吗?【解】此命题正确。

数据结构 第八章 查找表

第八章查找表一、选择题1.若查找每个记录的概率均等,则在具有n个记录的连续顺序文件中采用顺序查找法查找一个记录,其平均查找长度ASL为( )。

A. (n-1)/2 B. n/2 C. (n+1)/2 D. n2. 对N个元素的表做顺序查找时,若查找每个元素的概率相同,则平均查找长度为( )A.(N+1)/2 B. N/2 C. N D. [(1+N)*N ]/23.顺序查找法适用于查找顺序存储或链式存储的线性表,平均比较次数为((1)),二分法查找只适用于查找顺序存储的有序表,平均比较次数为((2))。

在此假定N为线性表中结点数,且每次查找都是成功的。

A.N+1B.2log2NC.logND.N/2E.Nlog2NF.N24. 下面关于二分查找的叙述正确的是 ( )A. 表必须有序,表可以顺序方式存储,也可以链表方式存储C. 表必须有序,而且只能从小到大排列B. 表必须有序且表中数据必须是整型,实型或字符型D. 表必须有序,且表只能以顺序方式存储5. 对线性表进行二分查找时,要求线性表必须()A.以顺序方式存储B.以顺序方式存储,且数据元素有序C.以链接方式存储D.以链接方式存储,且数据元素有序6.适用于折半查找的表的存储方式及元素排列要求为( )A.链接方式存储,元素无序 B.链接方式存储,元素有序C.顺序方式存储,元素无序 D.顺序方式存储,元素有序7. 用二分(对半)查找表的元素的速度比用顺序法( )A.必然快 B. 必然慢 C. 相等 D. 不能确定8.当在一个有序的顺序存储表上查找一个数据时,即可用折半查找,也可用顺序查找,但前者比后者的查找速度( )A.必定快 B.不一定 C. 在大部分情况下要快 D. 取决于表递增还是递减9. 具有12个关键字的有序表,折半查找的平均查找长度()A. 3.1B. 4C. 2.5D. 510. 折半查找的时间复杂性为()A. O(n2)B. O(n)C. O(nlog n)D. O(log n)11.当采用分快查找时,数据的组织方式为 ( )A.数据分成若干块,每块内数据有序B.数据分成若干块,每块内数据不必有序,但块间必须有序,每块内最大(或最小)的数据组成索引块C. 数据分成若干块,每块内数据有序,每块内最大(或最小)的数据组成索引块D. 数据分成若干块,每块(除最后一块外)中数据个数需相同12. 二叉查找树的查找效率与二叉树的( (1))有关, 在 ((2))时其查找效率最低(1): A. 高度 B. 结点的多少 C. 树型 D. 结点的位置(2): A. 结点太多 B. 完全二叉树 C. 呈单枝树 D. 结点太复杂。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。






二叉排序树插入新结点的过程 在二叉排序树中插入新结点,要保证插入后仍满足 BST性质。其插入过程是: 1)若二叉排序树T为空,则为待插入的关键字key申请 一个新结点,并令其为根; 2)若二叉排序树T不为空,则将key和根的关键字比较: (a)若二者相等,则说明树中已有此关键字key,无 须插入。 (b)若key<T→key,则将key插入根的左子树中。 (c)若key>T→key,则将它插入根的右子树中。



二叉排序树的特点 (1) 二叉排序树中任一结点x,其 左(右)子树中任一结点y(若存在)的 关键字必小(大)于x的关键字。 (2) 二叉排序树中,各结点关键 字是惟一的。 (3) 按中序遍历该树所得到的中 序序列是一个递增有序序列。
二叉排序树的存储结构



int KeyType; typedef struct node { KeyType key; InfoType otherinfo; struct node *lchild,*rchild; } BSTNode; typedef BSTNode *BSTree;


顺序查找的优点 算法简单,且对表的结构无任何要求,无论是用 向量还是用链表来存放结点,也无论结点之间是 否按关键字有序,它都同样适用。 顺序查找的缺点 查找效率低。
二分查找


二分查找又称折半查找,它是一种效率较高的查找方 法。 二分查找要求:线性表是有序表,即表中结点按关键 字有序,并且要用向量作为表的存储结构。不妨设有 序表是递增有序的。
8.2线性表的查找
顺序查找(Sequential Search) 基本思想是:从表的一端开始,顺序扫描线性表, 依次将扫描到的结点关键字和给定值K相比较。若当 前扫描到的结点关键字与K相等,则查找成功;若扫 描结束后,仍未找到关键字等于K的结点,则查找失 败。
基于顺序结构的顺序查找算法
类型说明 typedef struct{ KeyType key; /* KeyType由用户定义 */ InfoType otherinfo; /* 此类型依赖于应用 */ }NodeType; typedef NodeType Seqlist[n+1]; /*多出0号单 元用作监视哨*/
第八章
查找
基本概念 线性表的查找 树表的查找 散列(Hash)技术
8.1查找的基本概念
查找(Searching)的定义是:给定一个关键 字值K,在含有n个结点的表中找出关键字等于 给定值K的结点。若找到,则查找成功,返回 该结点的信息或该结点在表中的位置;否则查 找失败,返回相关的指示信息。
lg(n 1)
二分查找的优点和缺点


虽然二分查找的效率高,但是要将 表按关键字排序。 二分查找只适用顺序存储结构。为 保持表的有序性,在顺序结构里插 入和删除都必须移动大量的结点。
分块查找

分块查找表存储结构 分块查找表由"分块有序"的线性表 和索引表组成。


分块查找的基本思想 : 首先查找索引表 索引表是有序表,可采用二分查找 或顺序查找,以确定待查的结点在 哪一块。 然后在已确定的块中进行顺序查找 由于块内无序,只能用顺序查找。



二叉排序树的生成 是从空的二叉排序树开始,每输入 一个结点数据,就调用一次插入算 法将它插入到当前已生成的二叉排 序树中。
生成二叉排序树 的算法 见右边









BSTree CreateBST(void) { BSTree T=NULL; KeyType key; scanf("%d", &key); while(key) { InsertBST(&T, key); scanf("%d", &key); } return T; }
查找表的数据结构表示
若在查找的同时对表做修改操作(如插入和删除 等),则相应的表称之为动态查找表(Dynamic Search Table)。否则称之为静态查找表(Static Search Table)。 若整个查找过程都在内存进行,则称之为内查找; 反之,若查找过程中需要访问外存,则称之为外
例:设算法的输入实例中有序的关键 字序列为: 05,13,19,21,37,56, 64,75,80,88,92查找的关键字
K=21

第一步:05,13,19,21,37,56,64,
low
75,80,88,92
m id
high

第二步:05,13,19,21,37,56,64,
low

3)*p有两个孩子 先令q=p,将被删结点的地址保存在q 中;然后找*q的中序后继*p,并在查 找过程中仍用parent记住*p的双亲位 置。*q的中序后继*p一定是*q的右子 树中最左下的结点,它无左子树。因 此,可以将删去*q的操作转换为删去 的*p的操作,即在释放结点*p之前将 其数据复制到*q中,就相当于删去了 *q。








p=(BSTNode *)malloc(sizeof(BSTNode )); p->key=key; p>lchild=p->rchild=NULL; if(*TPtr==NULL) *Tptr=p; else if(key<f->key) f->lchild=p; else f->rchild=p; }
查找关键字等于给定值K=24的结点
(见P199)

因为索引表小,不妨用顺序查找方法查 找索引表。即首先将K依次和索引表中 各关键字比较,直到找到第1个关键宇 大小等于K的结点,由于K<48,所以关 键字为24的结点若存在的话,则必定在 第二块中;然后,由ID[2].addr找到第 二块的起始地址7,从该地址开始在 R[7..12]中进行顺序查找,直到 R[11].key=K为止。
算法分析 生成林成功时的顺序查找的平均查找长度 : n n ASL= pici =pi (n i 1) =np1+(ni 1 i 1 1)p2+…+2pn-1+pn (式8.2) 在等概率情况下,pi=1/n(1≤i≤n),故成 功的平均查找长度为 (n+…+2+1)/n=(n+1)/2 即查找成功时的平均比较次数约为表长的 一半。

分块查找的优点 ①在表中插入或删除一个记录时,只 要找到该记录所属的块,就在该块内 进行插入和删除运算。 ②因块内记录的存放是任意的,所以 插入或删除比较容易,无须移动大量 记录。


8.3 树表的查找





1、二叉排序树的定义 二叉排序树(Binary Sort Tree)又称二叉查找 (搜索)树(Binary Search Tree)。其定义为:二 叉排序树或者是空树,或者是满足如下性质的二 叉树: (1)若它的左子树非空,则左子树上所有结点 的值均小于根结点的值; (2)若它的右子树非空,则右子树上所有结点 的值均大于根结点的值; (3)左、右子树本身又各是一棵二叉排序树。
75,80,88,92
m id
high

第三步:05,13,19,21,37,56,64,
low high
m id
75,80,88,92 此时R[mid].key=K,return mid=4。
二分查找判定树 二分查找过程可用二叉树来描述: 把当前查找区间的中间位置上的结 点作为根,左子表和右子表中的结 点分别作为根的左子树和右子树。 由此得到的二叉树,称为描述二分 查找的判定树(Decision Tree)或比较 树(Comparison Tree)。
二叉排序树删除算法





void DelBSTNode(BSTree *Tptr,KeyType key) { BSTNode *parent=NUll, *p=*Tptr,*q,*child; while(p){ if(p->key==key) break; parent=p; p=(key<p->key)?p>lchild:p->rchild; } if(!p) return; q=p; if(q->lchild&&q->rchild) for(parent=q,p=q>rchild; p->lchild;

二叉排序树插入新结点的 算法
void InsertBST(BSTree *Tptr,KeyType key) { BSTNode *f,*p=*TPtr; while(p){ if(p->key==key) return; f=p; p=(key<p->key)?p>lchild:p>rchild; }



算法分析 分块查找是两次查找过程。整个查找过程 的平均查找长度是两次查找的平均查找长 度之和。 以二分查找来确定块,分块查找成功 时的平均查找长度 ASLblk=ASLbn+ASLsq≈lg(b+1)1+(s+1)/2≈lg(n/s+1)+s/2 以顺序查找确定块,分块查找成功时 的平均查找长度 ASL’blk=(b+1)/2+(s+1)/2=(s2+2s+n)/(2 s)



2) 删去*p。 删*p时,应将*p的子树(若有)仍连接在树 上且保持BST性质不变。按*p的孩子数目分 三种情况进行处理。 ②删除*p结点的三种情况 1)*p是叶子(即它的孩子数为0) 无须连接*p的子树,只需将*p的双亲 *parent中指向*p的指针域置空即可。 2)*p只有一个孩子*child 只需将*child和*p的双亲直接连接后,即 可删去*p。
相关文档
最新文档