动态查找表(二叉排序树)
数据结构-动态查找表

数据结构-动态查找表⼀、动态查找的概念:动态查找表:表结构在查找过程中动态⽣成。
要求:对于给定值key, 若表中存在其关键字等于key的记录,则查找成功返回(或者删除之);否则插⼊关键字等于key 的记录。
⼆、动态查找表1. 1. ⼆叉排序树的定义⼆叉排序树的定义(Binary Sort Tree或Binary Search Tree):⼆叉排序树或者是⼀棵空树,或者是满⾜下列性质的⼆叉树:(1)若左⼦树不为空,则左⼦树上的所有结点的值(关键字)都⼩于根节点的值;(2)若右⼦树不为空,则右⼦树上的所有结点的值(关键字)都⼤于根节点的值;(3)左、右⼦树都分别为⼆叉排序树。
如下图15-1所⽰,该图中的树就是⼀棵⼆叉排序树。
任何⼀个⾮叶⼦结点的左⼦树上的结点值都⼩于根结点,右⼦树上的结点值都⼤于根结点的值。
图1中,⼆叉树的结点值中序遍历的结果为:3,12,24,37,45,53,61,78,90,100。
结论:若按中序遍历⼀棵⼆叉排序树,所得到的结点序列是⼀个递增序列。
1. 1. ⼆叉排序树(BST树)的查找思想BST树的查找思想:(1)⾸先将给定的K值与⼆叉排序树的根节点的关键字进⾏⽐较:若相等,则查找成功;(2)若给定的K值⼩于BST树的根节点的关键字:继续在该节点的左⼦树上进⾏查找;(3)若给定的K值⼤于BST树的根节点的关键字:继续在该节点的右⼦树上进⾏查找。
1. 2. ⼆叉排序树总结(1)查找过程与顺序结构有序表中的折半查找相似,查找效率⾼;(2)中序遍历此⼆叉树,将会得到⼀个关键字的有序序列(即实现了排序运算);(3)如果查找不成功,能够⽅便地将被查元素插⼊到⼆叉树的叶⼦结点上,⽽且插⼊或删除时只需修改指针⽽不需移动元素。
三、红⿊树1. 1. 红⿊树的定义红⿊树(Red Black Tree)是⼀种⾃平衡⼆叉查找树,是在计算机科学中⽤到的⼀种数据结构,典型的⽤途是实现关联数组。
它是在1972年由Rudolf Bayer发明的,当时被称为平衡⼆叉B树(symmetric binary B-trees)。
查找-动态查找表-二叉排序树

查找-动态查找表-⼆叉排序树⽂字描述 ⼆叉排序树的定义 ⼜称⼆叉查找树,英⽂名为Binary Sort Tree, 简称BST。
它是这样⼀棵树:或者是⼀棵空树;或者是具有下列性质的⼆叉树:(1)若它的左⼦树不空,则左⼦树上所有结点的值均⼩于它的根结点的值;(2)若它的右⼦树不空,则右⼦树上所有结点的值均⼤于它的根结点的值;(3)它的左、右⼦树也分别是⼆叉排序树。
⼆叉排序树的查找 其查找过程和次优⼆叉树类似。
即当⼆叉排序树不为空时,⾸先将给定值和根结点的关键字⽐较,若相等,则查找成功,否则将依据给定值和根结点的关键字之间的⼤⼩关系,分别在左⼦树或右⼦树上继续进⾏查找。
⼆叉排序树的插⼊ 和次优查找树相对,次优查找树是⼀种静态查找表。
⽽⼆叉排序树是⼀种动态树表,其特点是,树的结构通常不是⼀次⽣成的,⽽是在查找过程中,当树中不存在关键字等于给定值的结点时再进⾏插⼊。
新插⼊的结点⼀定是⼀个新添加的叶⼦结点,并且是查找不成功时查找路径上访问的最后⼀个结点的左孩⼦或右孩⼦结点。
⼆叉排序树的删除 在⼆叉排序树上删除⼀个结点相当于删除有序序列中的⼀个纪录,只要在删除某个结点之后依旧保持⼆叉排序树的特性即可。
假设被删除结点*p(指向结点的指针为p),其双亲结点*f(结点类型为f),且不失⼀般性,可设*p是*f的左孩⼦。
下⾯分3种情况进⾏讨论: (1)若*p结点为叶⼦结点,即PL和PR均为空树。
由于删除叶⼦结点*p不破坏整棵树的结构,则只需修改其双亲结点的指针即可。
(2)若*p结点只有左⼦树PL或只有右⼦树PR,此书只要令PL或PR直接成为其双亲结点*f的左⼦树即可。
(3)若*p结点的左⼦树和右⼦树均不为空。
从下图知,在删除*p之前,中序遍历该⼆叉树的序列为{…C L C…Q L QS L SPP R F…}, 在删除*p 之后,为保持其他元素之间的相对位置不变,可以有两种⽅法:[3.1]令*p的左⼦树为*f的左⼦树,⽽*p的右⼦树为*s的右⼦树。
数据结构实验报告六—BST(二叉查找树)实现动态查找表

输出:查找成功3 //返回成功和查找时比较的次数
请输入查找数:34//查找34
输出:查找成功1 //返回成功和查找时比较的次数
请输入查找数:100//查找100
输出:查找不成功3 //返回成功和查找时比较的次数
注:当输入字符型数据时,程序会终止。
二、概要设计:
抽象数据类型
2 、运行程序时
提示输入数据个数并且输入数据
本程序可以实现一个动态查找表,能实现构建和查找两个功能。
提示:请输入表达式:
输出
提示:请输入查找数据:
输出:查找成功/查找不成功 并且后面注有查找次数
七、实验心得(可选)
本次实验较上次实验简单,所以做起来还算过得去。而且在实验过程中通过与同学的讨论加深了对二叉查找树的理解,对BST(二叉查找树)算法的应用有了初步的掌握。
cout<<"请输入欲查找的数:";
}
system("pause");
return 0;
}
else if(data>subroot->data)
{return searchTree(subroot->pRightChild,data);}
else if(data=subroot->data)
{cout<<"查找成功"<<i<<endl; }
}
else
{lt;<i<<endl;
输出格式:每当输入一个暑假,就输出查找成功或不成功,并且后面有
数字表示查找的次数,例如:34//查找34,输出:查找成功
1//表示查找时比较的次数。
数据结构二叉排序树

05
13
19
21
37
56
64
75
80
88
92
low mid high 因为r[mid].key<k,所以向右找,令low:=mid+1=4 (3) low=4;high=5;mid=(4+5) div 2=4
05
13
19
low
21
37
56
64
75
80
88
92
mid high
因为r[mid].key=k,查找成功,所查元素在表中的序号为mid 的值
平均查找长度:为确定某元素在表中某位置所进行的比 较次数的期望值。 在长度为n的表中找某一元素,查找成功的平均查找长度:
ASL=∑PiCi
Pi :为查找表中第i个元素的概率 Ci :为查到表中第i个元素时已经进行的比较次数
在顺序查找时, Ci取决于所查元素在表中的位置, Ci =i,设每个元素的查找概率相等,即Pi=1/n,则:
RL型的第一次旋转(顺时针) 以 53 为轴心,把 37 从 53 的左上转到 53 的左下,使得 53 的左 是 37 ;右是 90 ,原 53 的左变成了 37 的右。 RL型的第二次旋转(逆时针)
一般情况下,假设由于二叉排序树上插入结点而失去 平衡的最小子树的根结点指针为a(即a是离插入结点最 近,且平衡因子绝对值超过1的祖先结点),则失去平衡 后进行调整的规律可归纳为下列四种情况: ⒈RR型平衡旋转: a -2 b -1 h-1 a1
2.查找关键字k=85 的情况 (1) low=1;high=11;mid=(1+11) / 2=6
05
13
19
21
第9章-查找第3讲-动态查找表(二叉排序树)

二叉排序树的结点类型如下:
6/27
1、二叉排序树上的查找
二叉排序树可看做是一个有序表,所以在二叉排序树上进行查 找,和二分查找类似,也是一个逐步缩小查找范围的过程。
bt
N
k < bt->key
k > bt->key
每一层只和一个结点进行关键字比较!
7/27
查找失败的情况
p 查找到p所指结点
14/27
加上13个外部结点:
18 2
4 11
25 46
39 32
53 74
67 60
ASL不成功=
1×2+3 ×3+4 ×4+3 × 5+2 ×6 =4.15
13
15/27
二叉排序树的特点
3300
20
5500 4400
最左下结点,
3355
即为关键字
最小的结点
32
bt
8800 9900
85
最右下结点, 即为关键字 最大的结点
12/27
序列: 25 18 46 2 53 39 32 4 74 67 60 11
25
18
46
2 4
39 32
53 74
11
67
60
二叉排序树创建完毕
13/27
18 2
4
25 46
39 32
53 74
ASL成功=
11
67
60
1×1+2 ×2+3 ×3+3 × 4+2 ×5+1 ×6 =3.5
12
9/27
2、二叉排序树的插入和生成
l根据动态查找表的定义,“插入”操作在查找不成功时才进行 l插入原则:若二叉排序树为空,则插入结点应为新的根结点;
动态查找表的几种查找方法

动态查找表的几种查找方法动态查找表是计算机科学中常用的数据结构,用于在大量数据中高效地查找目标值。
动态查找表的查找方法有多种,包括线性查找、二分查找、哈希查找和二叉查找树等。
本文将对这几种查找方法进行详细介绍。
一、线性查找线性查找是最简单的查找方法之一,它逐个比较待查找元素和数据集中的每个元素,直到找到目标值或遍历完整个数据集。
线性查找的时间复杂度为O(n),其中n为数据集的大小。
二、二分查找二分查找是一种高效的查找方法,前提是数据集必须是有序的。
它通过将数据集分成两部分,并与目标值进行比较,从而确定目标值在哪一部分中,然后在该部分中继续进行二分查找。
二分查找的时间复杂度为O(log n),其中n为数据集的大小。
三、哈希查找哈希查找是一种基于哈希表的查找方法,它通过将目标值经过哈希函数转换成一个索引,然后在哈希表中查找该索引对应的值。
哈希查找的时间复杂度为O(1),即常数时间。
然而,哈希查找的效率受到哈希函数和哈希冲突的影响,如果存在大量的哈希冲突,查找效率会降低。
四、二叉查找树二叉查找树(Binary Search Tree,简称BST)是一种基于二叉树的查找方法。
它具有以下特点:对于二叉查找树中的任意节点,其左子树中的所有节点值都小于它的值,右子树中的所有节点值都大于它的值。
通过比较目标值和当前节点的值,可以确定目标值在左子树还是右子树中,从而实现查找操作。
二叉查找树的平均时间复杂度为O(log n),其中n为二叉查找树中节点的个数。
以上是动态查找表的几种常见的查找方法,每种方法都有其适用的场景和优劣势。
在选择查找方法时,需要根据具体的需求和数据特点来进行选择。
如果数据集较小且无序,线性查找可能是一种较好的选择;如果数据集有序,二分查找是一种高效的方法;如果对查找速度要求很高,可以考虑使用哈希查找;如果需要频繁进行插入和删除操作,并且希望保持数据有序,可以选择二叉查找树。
除了以上介绍的几种查找方法,还有其他一些常见的动态查找表,如平衡二叉树、红黑树、B树等。
数据结构_动态查找表

注意:新插入的结点总是叶子结点
10
将数的序列:122、99、250、110、300、280 作为二 叉查找树的结点的关键字值,生成二叉查找树。
122 122 122 99 250 99 110 122 99 99 110 122 250 250 300 99 110
5
二叉排序树的操作
• 特定节点在树上是否存在 • 插入一个节点 • 删除一个节点
由于树是递归定义的,因此这些操作往往也用递 归实现。因为二叉树的平均高度为logN,这些操
作的时间复杂度也是O(logN)
6
查找过程
• 若根结点的关键字值等于查找的关键字, 成功。 • 否则,若小于根结点的关键字值,查其 左子树。若大于根结点的关键字值,查 其右子树。在左右子树上的操作类似。
7
122
如:查找122,
查找110,
99
250
查找230,
110 200 300
查找225
105
230
216
8
查找过程的递归描述
• 如果树为空,返回false • 如果根节点等于被查结点,返回true • 如果被查节点小于根节点,递归查找左 子树 若二叉树为空。则新插入的结点成为根结 点。 • 如二叉树非空
• 如果p的右子树若非空,则右子树上的所有结 点的关键字值均大于p结点的关键字值。
• 结点p的左右子树同样是二叉排序树。
3
e、g:二叉排序树
122 L
99
250 C 200 300 E M P N
110
105
数据结构_第9章_查找2-二叉树和平衡二叉树

F
PS
C
PR
CL Q
QL SL S SL
10
3
18
2
6 12
6 删除10
3
18
2
4 12
4
15
15
三、二叉排序树的查找分析
1) 二叉排序树上查找某关键字等于给定值的结点过程,其实 就是走了一条从根到该结点的路径。 比较的关键字次数=此结点的层次数; 最多的比较次数=树的深度(或高度),即 log2 n+1
-0 1 24
0 37
0 37
-0 1
需要RL平衡旋转 (绕C先顺后逆)
24
0
-012
13
3573
0
01
37
90
0 53 0 53
0 90
作业
已知如下所示长度为12的表:
(Jan, Feb, Mar, Apr, May, June, July, Aug, Sep, Oct, Nov, Dec)
(1) 试按表中元素的顺序依次插入一棵初始为空的二叉 排序树,画出插入完成之后的二叉排序树,并求其在 等概率的情况下查找成功的平均查找长度。
2) 一棵二叉排序树的平均查找长度为:
n i1
ASL 1
ni Ci
m
其中:
ni 是每层结点个数; Ci 是结点所在层次数; m 为树深。
最坏情况:即插入的n个元素从一开始就有序, ——变成单支树的形态!
此时树的深度为n ; ASL= (n+1)/2 此时查找效率与顺序查找情况相同。
最好情况:即:与折半查找中的判ห้องสมุดไป่ตู้树相同(形态比较均衡) 树的深度为:log 2n +1 ; ASL=log 2(n+1) –1 ;与折半查找相同。
动态查找树表

平衡二叉树
结点旳平衡因子:该结点旳左子树旳深度减去 它旳右子树旳深度 平衡二叉树全部结点旳平衡因子只可能为: -1,0,1。
平衡二叉树
2
5
2
0
4
8
1
2
0
1
平衡因子 >1
1
5
1
0
4
8
0
2
平衡因子 <=1
非平衡树
平衡树
平衡二叉树旳构造
1)新结点插在平衡因子值为0旳结点左或右都不会
造成不平衡。
平衡结点
2)将BCA向右旋转90度,把C旳右孩子变为A旳左孩子,A变为
C旳右孩子;C带替A旳位置。
2
A
A
0C
2
C B
AR h-1
C 0B
-1 A AR h-1
CL h-2 CR h-1 BL h-1
X
CL h-1 BL h-1
h-2 CR
AR h-1
X
平衡二叉树旳构造
3.RR型 新结点插在右重结点a( a是离新结点插入位置近来旳右重 结点地址)旳右孩子旳右分支上。如下图棕色代表新结点, 称 RR型。
动态查找树表—平衡二叉树
平衡二叉树旳定义
怎样构造平衡二叉树 平衡二叉树旳查找性能分析 课堂练习 程序讲解 小结和作业
动态查找树表—平衡二叉树
造成不平衡旳原因 LL型 LR型 RR型
RL型 总结 应用举例
平衡二叉树
由关键字序列 1,2,3,4, 由关键字序列 3,1,2,5,
5构造而得旳二叉排序树, 4构造而得旳二叉排序树
4.RL型调整过程-----①:
1)将CB向右旋转90度,把CR变为B旳 左子树,把B变为C
24动态查找表---二叉排序树

动态查找表的类型定义
TraverseDSTable(DT, Visit());
初始条件:动态查找表DT存在,Visit是对结点 操作的应用函数;
操作结果:按某种次序对DT的每个结点调用函数 Visit() 一次且至多一次。一旦 Visit() 失败, 则操作失败。
二叉查找树
定义
查找算法
插入算法
删除算法
DestroyDSTable(&DT); 初始条件:动态查找表DT存在; 操作结果:销毁动态查找表DT。
动态查找表的类型定义
SearchDSTable(DT, kval); 初始条件:动态查找表 DT 存在,kval为和关键 字类型相同的给定值; 操作结果:若 DT 中存在其关键字等于 kval的数 据元素,则函数值为该元素的值或在表中的位置, 否则为“空”。
二叉查找树查找操作
从上述查找过程可见: 在查找过程中,生成了一条查找路径: 查找成功:从根结点出发,沿着左分支或右分支 逐层向下直至关键字等于给定值的结点; 查找不成功:从根结点出发,沿着左分支或右分 支逐层向下直至指针指向空树为止。
二叉查找树查找算法
Status SearchBST (BiTree T, KeyType kval, BiTree f, BiTree &p ) { // 若查找成功,函数值为 TRUE // 指针 p 指向该数据元素的结点 //查找不成功,函数值为FALSE // 指针 p 指向查找路径上访问的最后一个结点 // 指针 f 指向当前访问的结点的双亲 //其初始调用值为NULL
(3)它的左、右子树也都分别是二叉查找树。
又称为二叉排序树
二叉查找树-来源
05 13 19 21 37 56 64 75 80 88 92
静态查找表动态查找表二叉搜索树AVL树哈希表(Hash)

//在根指针T所指二叉排序树中递归地查找某关键字等于key的数据元素, //若查找成功则返回指向该数据元素的指针,否则返回空指针
if ((!T) || EQ(key, T->data.key)) return (T);
else if (LT(key, T->data.key)) return (SearchBST(T->lchild, key));
}ADT StaticSearchTable
9.1.1顺序表的查找
顺序查找:从表中最后一个记录开始,逐个进 行记录的关键字和给定值的比较,若某个记录 的关键字和给定值比较相等,则查找成功,找 到所查记录;反之,查找不成功。
静态查找表的顺序存储结构
typedef struct { ElemType *elem; int length; }SSTable;
如果一棵二叉搜索树是高度平衡的,它就成为 AVL树。如果它有 n 个结点,其高度可保持在 O(log2n),平均搜索长度也可保持在O(log2n)。
AVL树的高度
设在新结点插入前AVL树的高度为 h,结点个 数为 n,则插入一个新结点的时间是O(h)。对 于AVL树来说,h 多大?
动态查找表详解

(3)若插0 入后导致不平衡,则进行调整。1
45
45
-1 12
0
1
3
37
0
24
1 90
-1 61
0 78
插入 15
0 100
-2 12
0
2
3
37
1
24
1
90
0
0
61
100
0
0
50 78
0
15
四、平衡的二叉树的插入
(1)找插入位置;
(2)插入结点;
(3)若插1 入后导致不平衡,则进行调整。0
45
45
0
93
四、平衡的二叉树的插入
(1)找插入位置;
(2)插入结点;
(3)若插入后导致不平衡,则进行调整。
0 45
0 45
-1 12
0
1
3
37
0
24
1
插入 50
1
90
-1 12
90
-1
0
61
100
0
1
0 61
0 100
3
37
0 78
0
0
0
24
50 78
四、平衡的二叉树的插入
(1)找插入位置;
(2)插入结点;
显然,在磁盘上进行一次查找比在内存中进行一次查找耗费时间多得多, 因此,在磁盘上进行查找的次数、即待查关键字所在结点在B-树上的层次 数,是决定B-树查找效率的首要因素。 考虑最坏情况,即待查结点在B-树上的最大层次数,即含N个关键字的m 阶B-树的最大深度是多少?
三、B-树查找分析
设关键字的总数为 N ,求 m阶 B-树的最大层次 L。
数据结构课程设计动态查找表教材

数据结构课程设计动态查找表教材动态查找表是数据结构课程中的重要内容之一,它在实际应用中有着广泛的应用。
本文将介绍动态查找表的基本概念、常见的实现方式以及一些相关的应用场景。
一、动态查找表的基本概念动态查找表是指在查找表中插入、删除和查找操作频繁的情况下,能够动态地调整表的结构以提高查找效率的数据结构。
常见的动态查找表有二叉查找树、平衡二叉查找树、B树、B+树等。
1. 二叉查找树二叉查找树是一种基于二叉树结构的动态查找表,它的特点是左子树的所有节点值小于根节点的值,右子树的所有节点值大于根节点的值。
通过比较节点值,可以快速定位到目标节点。
但是,如果插入的节点值有序或者近似有序,会导致二叉查找树的高度增加,进而影响查找效率。
2. 平衡二叉查找树为了解决二叉查找树在有序数据插入时的效率问题,人们提出了平衡二叉查找树的概念。
平衡二叉查找树是一种自平衡的二叉查找树,它通过旋转操作保持树的平衡性,从而提高了查找效率。
常见的平衡二叉查找树有AVL树、红黑树等。
3. B树和B+树B树和B+树是一种多路查找树,它们通过增加节点的子节点数目,减少树的高度,从而提高查找效率。
B树是一种平衡的多路查找树,每个节点可以有多个子节点。
B+树是在B树的基础上进行了优化,它的非叶子节点只存储索引信息,而数据都存储在叶子节点上,这样可以减少磁盘I/O操作,提高查询效率。
二、动态查找表的实现方式动态查找表的实现方式有多种,根据具体的应用场景和需求选择合适的实现方式。
1. 二叉查找树的实现二叉查找树可以通过链表或者数组来实现。
链表实现的二叉查找树每个节点包含左子节点、右子节点和节点值三个属性,通过指针来连接各个节点。
数组实现的二叉查找树是一种顺序存储结构,通过数组的下标来表示节点的位置。
2. 平衡二叉查找树的实现平衡二叉查找树的实现可以借助旋转操作来保持树的平衡性。
对于AVL树来说,每个节点需要记录左右子树的高度差,通过旋转操作来调整树的平衡性。
第九章查找2动态查找表(1)

37
88
5
56 75
92
37
88
19
19
21
9.2 动态查找表
3、删除算法
情况二:被删结点只有左子树或右子树中的一种 修改其左或右子树叶子结点挂到双亲结点上
64
13
80
5
56 75
92
37
88
19
21
64
13
80
5
37 75
92
19
88
21
9.2 动态查找表
3、删除算法
情况三:被删结点既有左子树又有右子树
f->rchild=p;
13
80
5
56 75
92
free(q); }//else }//if
f 37
88
p
q 19
}//DeleteBSF
p 21
9.2 动态查找表
四.二叉排序树的查找分析
1) 二叉排序树上查找某关键字等于给定值的过程,其实就是 走了一条从根到该结点的路径。
2) 二叉排序树的查找性能取决于二叉排序树的形状。
说明 输入序列决定了二叉排序树的形态
输入3,2,1 输入2,3,1
输入1,2,3
3 2 1
2 13
1 2 3
9.2 动态查找表
三.二叉排序树的操作
1、查找算法
查找过程为:当二叉树不空时,首先将 给定值和根结点的关键字比较,若相等, 则查找成功,否则将依据给定值和根结点 的关键字之间的大小关系,分别在左子树 或右子树上继续进行查找。
9.2 动态查找表
三.二叉排序树的操作
1、查找算法
例 在如下二叉排序树中查找关键字为24的记录
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
北京理工大学珠海学院计算机学院课程设计动态查找表摘要数据结构是研究与数据之间的关系我们称这一关系为数据的逻辑结构简称数据结构。
当数据的逻辑结构确定以后数据在物理空间中的存储方式称为数据的存储结构。
相同的逻辑结构可以具有不同的存储结构因而有不同的算法。
本次课程设计程序中的数据采用“树形结构”作为其数据结构。
具体采用的是“二叉排序树”并且使用“二叉链表”来作为其存储结构。
本课程设计实现了二叉排序树的创建、中序遍历、插入、查找和删除二叉排序树中某个结点。
本课程主要实现动态查找表的功能通过“二叉排序树”的算法和“二叉链表”的存储结构来实现。
本课程设计说明书重点介绍了系统的设计思路、总体设计、各个功能模块的设计与实现方法。
关键词数据结构 C语言二叉排序树动态二叉链表12目录摘要 (1)1ABSTRACT (3)23抽象数据类型动态查找表定义 (4)43 系统总体分析 (5)3.1系统模块划分 (5)3.2 二叉树的生成过程 (5)3.3 主要功能模块设计 (5)3.4 系统详细设计 (7)3.4.1 主函数菜单模块 (7)3.4.2 查找模块 (10)3.4.3 删除模块 (11)3.4.4 插入模块 (13)3.4.5 中序输出模块 (15)参考文献 (17)心得体会 (18)教师评语 (19)附录 (20)21 Abstract(摘要)Data structure is the relationship between research and data, we callthis relationship as a logical data structure, referred to as datastructures. When the data logical structure is determined, the data storedin the physical space, is known as the data storage structure. The samelogical structure can have different storage structure, which has adifferent algorithm.The curriculum design, program data is "tree" as its data structure.Specific uses "binary sort tree" and use "binary list" as its storagestructure. The course is designed to achieve a binary sort tree creation,in-order traversal, insert, find and delete a binary sort tree nodes.This course is mainly the function of dynamic look-up table, throughthe "binary search tree" algorithm and "binary list" of storage structures.This course is designed to highlight the system design concept, overalldesign, each functional module design and implementation.Keywords: C Language Data Structure Dynamic Binary Search Tree,Binary List32 抽象数据类型动态查找表定义ADT DynamicSearchTable{数据对象D D是具有相同特性的数据元素的集合。
各个数据元素含有类型相同可唯一标识数据元素的关键字。
数据关系R:数据元素同属一个集合。
基本操作PInitDSTable(&DT);操作结果构造一个空的动态查找表DT。
DestroyDSTable&DT;初始条件动态查找表DT存在。
操作结果销毁动态查找表DT。
SearchDSTable DT key;初始条件动态查找表DT存在key为和关键字类型相同的给定值。
操作结果若DT中存在其关键字等于key的数据元素则函数值为该元素的值或在表中的位置否则为“空”。
InsertDSTable&DT e;初始条件动态查找表DT存在e为待插入的数据元素。
操作结果若DT中不存在其关键字等于e的数据元素则插入e到DT。
DeleteDSTable&DT key;初始条件动态查找表DT存在key为和关键字类型相同的给定值。
操作结果若DT中存在其关键字等于key的数据元素则删除之。
InOrderTraverse(DT);初始条件动态查找表DT存在。
操作结果按中序的次序输出DT中的每个结点数据值。
}ADT DynamisSearchTable453 系统总体分析3.1系统模块划分二叉排序树是一种动态树表。
二叉排序树的定义二叉排序树或者是一棵空树或者是一棵具有如下性质的二叉树⑴若它的左子树非空则左子树上所有结点的值均小于根结点的值⑵若它的右子树非空则右子树上所有结点的值均大于根结点的值⑶左、右子树本身又各是一棵二叉排序树。
3.2 二叉树的生成过程二叉排序树的生成采用递归方式的边查找边插入的方式。
如图3.3 主要功能模块设计程序主要设计了五个功能首先是创建二叉排序树完成后出现任务菜单菜单中设计了六个模块查找删除插入中序输出清屏和退出。
5图2.3 主函数流程图3.4 系统详细设计3.4.1 主函数菜单模块该模块功能主要是给用户提供清晰的可操作界面易于人机操作并能很好的调用其他各模块使程序更加优化丝路更加清晰结构更加明了提高了程序的实用性。
其代码如下#include "BinaryTree.h"void main(){BiTree T = NULL;int arr[100];int n, i, k;int data;InitBiTree(T);printf("请输入结点数");scanf("%d", &n);printf("请输入数据");for(i = 0; i < n; i++){//输入要排序的数据scanf("%d", &arr[i]);}for(i = 0; i < n; i++){//构造二叉排序树InsertBiTree(T,arr[i]);}printf("按中序输出");InOrderTraverse(T); //调用中序输出函数将二叉排序树按中序输出printf("\n");Z:{//语句块供用户选择操作7printf("\t\t---------------------------\n");printf("\t\t| 功能菜单|\n");printf("\t\t---------------------------\n");printf("\t\t| 1.查找数据|\n");printf("\t\t---------------------------\n");printf("\t\t| 2.删除数据|\n");printf("\t\t---------------------------\n");printf("\t\t| 3.插入数据|\n");printf("\t\t---------------------------\n");printf("\t\t| 4.输出有序序列|\n");printf("\t\t---------------------------\n");printf("\t\t| 5.清屏|\n");printf("\t\t---------------------------\n");printf("\t\t| 6.退出|\n");printf("\t\t---------------------------\n\n");X:{//该语句块用于循环选择printf("请输入选择功能的序号");V:{//该语句块用于输入序号错误时重新输入scanf("%d", &k);}//end Vswitch(k){case 1:printf("请输入要查找的数据");scanf("%d", &data);if(InsertBiTree(T, data)){printf("不存在数据元素%d\n", data);}else{8printf("存在数据元素%d\n", data);}break;case 2:printf("请输入要删除的数据");scanf("%d", &data);if(!DeleteBiTree(T, data)){printf("不存在要输出的数据%d\n", data);}else{printf("删除操作成功\n");}break;case 3:printf("请输入要插入的数据");scanf("%d", &data);if(!InsertBiTree(T, data)){printf("要插入的数据%d已存在插入失败\n", data);}else{printf("插入操作成功\n");}break;case 4:printf("有序序列为");InOrderTraverse(T);printf("\n");break;case 5:system("cls");910goto Z;break;case 6:DestroyBiTree(T);exit(0);default:printf("输入字符错误请重新输入:");goto V;}//end switchprintf("\n\n");}//end Xgoto X;}//end Z}图2.4.13.4.2 查找模块该模块是给用户提供查找功能。