二叉排序树算法
二叉排序树
动态查找表
二、二叉排序树(插入举例)
插入结点94
56
13
5 21 19 75 37
64
92
80
88
94
11
第9章
第三节
查找
动态查找表
二、二叉排序树(插入函数)
//root为二叉排序树根结点,s为待查找结点 void InsertNode(BitTree &root, BiNode *s){ if(root){ if (s->data < root->data) InsertNode(root->lChild, s); //往左子树插入结点 else InsertNode(root->rChild, s); //往右子树插入结点 } else { root=s;return;} }
void BiSortTree::CreateBST(int *r, int n) { int i; BiNode *s; root=GetNode(r[0]); //生成根 for (i=1; i<n; i++) { //对输入的值,依次作插入操作 s = GetNode(r[i]); InsertNode(root, s); //在二叉排序树中插入一个结点s } }
26
第9章
第三节
二、二叉排序树(特性)
二叉排序树
• • • • 二叉排序树 平衡二叉树 B-树(B+树) 键树
二叉排序树
• 二叉排序树:或是一棵空二叉树,或是一棵具有下 列性质的二叉树:若左子树非空,则左子树上所有 结点的值均小于根结点的值;若右子树非空,则右 子树上所有结点的值均大于根结点的值;并且其左、 右子树均是二叉排序树。
类型定义为:
(b) 调整后恢复平衡
LR型调整的三个例子
1 1 2 0 2 0
31
0 -1
31
0
28
0 0
31
0 -1
31
0 0
28
-1
25
25
0
25 28
31
0
25
0
47
0
25
1百度文库
47
0
25
0
31
0
16 0
28
16
0
28
16
26
47
26
(a) LR(0)型调整
(b) LR(L)型调整
LR型调整的三个例子
1 2 0
9
28
47
(a)
树
BL 、BR 、AR 都是空
(b) BL、BR、AR 都是非空树
RR型调整操作示意图
-2
A
-1
B B BR S A AL BL BR
查找-动态查找表-二叉排序树
查找-动态查找表-⼆叉排序树
⽂字描述
⼆叉排序树的定义
⼜称⼆叉查找树,英⽂名为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的左⼦树即可。
详解平衡二叉树
一、平衡二叉树的概念
平衡二叉树(Balanced binary tree)是由阿德尔森-维尔斯和兰迪斯(Adelson-Velskii and Landis)于1962年首先提出的,所以又称为AVL树。
定义:平衡二叉树或为空树,或为如下性质的二叉排序树:
(1)左右子树深度之差的绝对值不超过1;
(2)左右子树仍然为平衡二叉树.
平衡因子BF=左子树深度-右子树深度.
平衡二叉树每个结点的平衡因子只能是1,0,-1。若其绝对值超过1,则该二叉排序树就是不平衡的。
如图所示为平衡树和非平衡树示意图:
二、平衡二叉树算法思想
若向平衡二叉树中插入一个新结点后破坏了平衡二叉树的平衡性。首先要找出插入新结点后失去平衡的最小子树根结点的指针。然后再调整这个子树中有关结点之间的链接关系,使之成为新的平衡子树。当失去平衡的最小子树被调整为平衡子树后,原有其他所有不平衡子树无需调整,整个二叉排序树就又成为一棵平衡二叉树。
失去平衡的最小子树是指以离插入结点最近,且平衡因子绝对值大于1的结点作为根的子树。假设用A表示失去平衡的最小子树的根结点,则调整该子树的操作可归纳为下列四种情况。
1)LL型平衡旋转法
由于在A的左孩子B的左子树上插入结点F,使A的平衡因子由1增至2而失去平衡。故需进行一次顺时针旋转操作。即将A的左孩子B向右上旋转代替A作为根结点,A向右下旋转成为B的右子树的根结点。而原来B的右子树则变成A的左子树。
(2)RR型平衡旋转法
由于在A的右孩子C 的右子树上插入结点F,使A的平衡因子由-1减至-2而失去平衡。故需进行一次逆时针旋转操作。即将A的右孩子C向左上旋转代替A作为根结点,A向左下旋转成为C的左子树的根结点。而原来C的左子树则变成A的右子树。
数据结构 二叉排序树
例如: 二叉排序树 50
30
20 40
80
90
35
32 查找关键字 = 50 , 35 , 90 , 95 ,
85
88
二叉链表类型定义:
typedef struct BiTNode{
KeyTyBaidu Nhomakorabeae key;
…… //其它成员
struct BiTNode *lchild; struct BiTNode *rchild; } BiTNode,*BiTree;
H(key)
通常设定一个一维数组空间存储记录集合,则 H(key)指示数组中的下标。
称这个一维数组为哈希(Hash)表或散列表。 称映射函数 H 为哈希函数。 H(key)为哈希地址
例:假定一个线性表为: A = (18,75,60,43,54,90,46) 假定选取的哈希函数为
hash3(key) = key % 13
{13,24,37,90,53,28,98}
插入点 插入后结果
13 24
13 A 24 B 13 13 24
失衡原因
调整
RR型
24
B
37
37
13 A 37
90
13
24 37 90
24
24 A 90 B
53
13
-2 37
二叉排序树
二叉排序树
1.二叉排序树定义
二叉排序树(Binary Sort Tree)或者是一棵空树;或者是具有下列性质的二叉树:(1)若左子树不空,则左子树上所有结点的值均小于根结点的值;若右子树不空,则右子树上所有结点的值均大于根结点的值。
(2)左右子树也都是二叉排序树,如图6-2所示。
2.二叉排序树的查找过程
由其定义可见,二叉排序树的查找过程为:
(1)若查找树为空,查找失败。
(2)查找树非空,将给定值key与查找树的根结点关键码比较。
(3)若相等,查找成功,结束查找过程,否则:
①当给值key小于根结点关键码,查找将在以左孩子为根的子树上继续进行,转(1)。
②当给值key大于根结点关键码,查找将在以右孩子为根的子树上继续进行,转(1)。
3.二叉排序树插入操作和构造一棵二叉排序树
向二叉排序树中插入一个结点的过程:设待插入结点的关键码为key,为将其插入,先要在二叉排序树中进行查找,若查找成功,按二叉排序树定义,该插入结点已存在,不用插入;查找不成功时,则插入之。因此,新插入结点一定是作为叶子结点添加上去的。构造一棵二叉排序树则是逐个插入结点的过程。对于关键码序列为:{63,90,70,55,67,42,98,83,10,45,58},则构造一棵二叉排序树的过程如图6-3所示。
4.二叉排序树删除操作
从二叉排序树中删除一个结点之后,要求其仍能保持二叉排序树的特性。
设待删结点为*p(p为指向待删结点的指针),其双亲结点为*f,删除可以分三种情况,如图6-4所示。
(1)*p结点为叶结点,由于删去叶结点后不影响整棵树的特性,所以,只需将被删结点的双亲结点相应指针域改为空指针,如图6-4(a)所示。
二叉排序树
• ⑤二叉排序树的生成过程 • 由输入实例(5,3,7,2,4,8),根据生成二叉排序树算法生成 二叉排序树的过程【参见动画演示】 • 注意: • 输入序列决定了二叉排序树的形态。 • 二叉排序树的中序序列是一个有序序列。所以对于一个任意的关 键字序列构造一棵二叉排序树,其实质是对此关键字序列进行排序, 使其变为有序序列。"排序树"的名称也由此而来。通常将这种排序称 为树排序(Tree Sort),可以证明这种排序的平均执行时间亦为O(nlgn)。 • 对相同的输入实例,树排序的执行时间约为堆排序的2至3倍。因 此在一般情况下,构造二叉排序树的目的并非为了排序,而是用它来 加速查找,这是因为在一个有序的集合上查找通常比在无序集合上查 找更快。因此,人们又常常将二叉排序树称为二叉查找树。
二叉排序树的特点 由BST性质可得: (1) 二叉排序树中任一结点x,其左(右)子树中任一结 点y(若存在)的关键字必小(大)于x的关键字。 (2) 二叉排序树中,各结点关键字是惟一的。 注意: 实际应用中,不能保证被查找的数据集中各元素的关键 字互不相同,所以可将二叉排序树定义中BST性质(1)里的 "小于"改为"大于等于",或将BST性质(2)里的"大于"改为" 小于等于",甚至可同时修改这两个性质。 (3) 按中序遍历该树所得到的中序序列是一个递增有 序序列。
平衡二叉树
平衡因子:平衡因子bf=左子树深度-右子树深度,
每个结点的平衡因子只能是1,0,-1。若其绝对值超过1,则该二叉排序树就是不平衡的。增加一个元素后,平衡二叉树有可能变成不平衡了,所以需要旋转平衡调整。
平衡二叉树算法思想:
若向平衡二叉树中插入一个新结点后破坏了平衡二叉树的平衡性。首先要找出插入新结点后失去平衡的最小子树根结点的指针。然后再调整这个子树中有关结点之间的链接关系,使之成为新的平衡子树。当失去平衡的最小子树被调整为平衡子树后,原有其他所有不平衡子树无需调整,整个二叉排序树就又成为一棵平衡二叉树。失去平衡的最小子树是指以离插入结点最近,且平衡因子绝对值大于1的结点作为根的子树。假设用A表示失去平衡的最小子树的根结点,则调整该子树的操作可归纳为下列四种情况:(可以断定插入一个节点一定是在叶子节点上)
{
*taller=0;
return 0;
}
if(data < T->data)
{
if(!InsertAVL(T->lchild,data,taller))
return 0;
if(*taller)
switch(T->bf)
{
case LH://插入前做左子树比右子树高,插入后,左子树已经长高,排序树失去平衡
*taller=0;
}
数据结构二叉排序树
平均查找长度:为确定某元素在表中某位置所进行的比 较次数的期望值。 在长度为n的表中找某一元素,查找成功的平均查找长度:
ASL=∑PiCi
Pi :为查找表中第i个元素的概率 Ci :为查到表中第i个元素时已经进行的比较次数
在顺序查找时, Ci取决于所查元素在表中的位置, Ci =i,设每个元素的查找概率相等,即Pi=1/n,则:
新的 24 的左为 13 RR型即逆时针旋转
④插入90,53后,又失去平衡, 可经过下列步骤转化为平衡二叉树 _2 37
24 0Fra Baidu bibliotek13
24
24 37 53 90 13 53 37 90
_2
90 1
13
53 0
第一次旋转(顺时针)以 53 为轴心,把 90 从 53 的右上,转到 53 的右下, 37 的右是 53 , 53 的右为 90 ,原 53 的右变成新 90 的左。
2.查找关键字k=85 的情况 (1) low=1;high=11;mid=(1+11) / 2=6
05
13
19
21
37
56
64
75
80
88
92
high
low mid 因为r[mid].key<k,所以向右找,令low:=mid+1=7 (2) low=7;high=11;mid=(7+11) / 2=9
数据结构之二叉树(BinaryTree)
数据结构之⼆叉树(BinaryTree)
⽬录
导读
⼆叉树是⼀种很常见的数据结构,但要注意的是,⼆叉树并不是树的特殊情况,⼆叉树与树是两种不⼀样的数据结构。
⽬录
⼀、⼆叉树的定义
⼆、⼆叉树为何不是特殊的树
三、⼆叉树的五种基本形态
四、⼆叉树相关术语
五、⼆叉树的主要性质(6个)
六、⼆叉树的存储结构(2种)
七、⼆叉树的遍历算法(4种)
⼋、⼆叉树的基本应⽤:⼆叉排序树、平衡⼆叉树、赫夫曼树及赫夫曼编码
⼀、⼆叉树的定义
如果你知道树的定义(有限个结点组成的具有层次关系的集合),那么就很好理解⼆叉树了。定义:⼆叉树是n(n≥0)个结点的有限集,⼆叉树是每个结点最多有两个⼦树的树结构,它由⼀个根结点及左⼦树和右⼦树组成。(这⾥的左⼦树和右⼦树也是⼆叉树)。
值得注意的是,⼆叉树和“度⾄多为2的有序树”⼏乎⼀样,但,⼆叉树不是树的特殊情形。具体分析如下
⼆、⼆叉树为何不是特殊的树
1、⼆叉树与⽆序树不同
⼆叉树的⼦树有左右之分,不能颠倒。⽆序树的⼦树⽆左右之分。
2、⼆叉树与有序树也不同(关键)
当有序树有两个⼦树时,确实可以看做⼀颗⼆叉树,但当只有⼀个⼦树时,就没有了左右之分,如图所⽰:
三、⼆叉树的五种基本状态
四、⼆叉树相关术语
是满⼆叉树;⽽国际定义为,不存在度为1的结点,即结点的度要么为2要么为0,这样的⼆叉树就称为满⼆叉树。这两种概念完全不同,既然在国内,我们就默认第⼀种定义就好)。
完全⼆叉树:如果将⼀颗深度为K的⼆叉树按从上到下、从左到右的顺序进⾏编号,如果各结点的编号与深度为K的满⼆叉树相同位置的编号完全对应,那么这就是⼀颗完全⼆叉树。如图所⽰:
二叉树的算法应用
二叉树是一种非常常见的树形数据结构,它被广泛应用于各种算法和数据结构中。以下是一些二叉树算法的应用:
1. 搜索二叉树:搜索二叉树是一种特殊的二叉树,它的每个节点都有一个值,并且每个节点的左子树中的所有节点的值都小于该节点的值,右子树中的所有节点的值都大于该节点的值。搜索二叉树可以用于快速查找、插入和删除操作。
2. 平衡二叉树:平衡二叉树是一种自平衡的二叉搜索树,它通过在插入和删除节点时调整树的结构来保持平衡。平衡二叉树可以保持树的深度较小,从而在查找、插入和删除操作时具有更好的时间复杂度。
3. 二叉堆:二叉堆是一种特殊的二叉树,它满足堆的性质,即每个节点的值都大于或等于其子节点的值。二叉堆可以用于实现优先队列、堆排序等算法。
4. 哈夫曼编码:哈夫曼编码是一种用于无损数据压缩的算法,它使用二叉树来表示数据流中的频繁项。哈夫曼编码可以有效地压缩数据,同时保持数据的可读性和可恢复性。
5. 决策树:决策树是一种基于二叉树的分类算法,它通过构建一棵二叉树来对数据进行分类。决策树可以用于解决分类问题、预测问题等。
总之,二叉树是一种非常有用的数据结构,它可以用于实现各种算法和数据结构。
二叉链表法
二叉链表法
二叉链表法是一种常用的二叉树存储结构。在二叉链表法中,每个节点包含三个信息:数据、左子树指针和右子树指针。通过将二叉树的每个节点用一个指针连接起来,可以方便地对二叉树进行遍历、查找和修改操作。
二叉链表法的定义如下:
```python
class Node:
def __init__(self, data):
self.data = data
self.left = None
self.right = None
class BinaryTree:
def __init__(self, root):
self.root = root
```
在二叉链表法中,root指向根节点。每个节点通过left指针和right指针分别指向左子树和右子树。叶子节点的left和right 指针都为空。
通过二叉链表法,可以轻松地实现二叉树的遍历算法。其中包括先序遍历、中序遍历和后序遍历。以下是这三种遍历算法的详细说明:
1. 先序遍历:先访问根节点,然后按照先序遍历的顺序递归地遍历左子树和右子树。先序遍历可以用递归方式实现,也可以使用栈进行迭代实现。
```python
def preorder(node):
if node is None:
return
print(node.data, end=" ")
preorder(node.left)
preorder(node.right)
```
2. 中序遍历:先按照中序遍历的顺序递归地遍历左子树,然后访问根节点,最后递归地遍历右子树。中序遍历同样可以用递归方式实现,也可以使用栈进行迭代实现。中序遍历的结果是按照节点值的大小升序排列的。
简述二叉树的五种形态
简述二叉树的五种形态
二叉树是一种树形结构,每个节点最多只有两个子节点,分别称为左子节点和右子节点。在实际应用中,二叉树的形态有五种基本类型,分别为满二叉树、完全二叉树、平衡二叉树、线索二叉树和二叉排序树。
1. 满二叉树:所有非叶子节点都有左右两个子节点,且所有叶子节点都在同一层,是一种高度平衡的二叉树。
2. 完全二叉树:除最后一层外,每一层都是满的,最后一层的节点从左到右连续地填满,是一种高效的数据结构,可以用数组来存储。
3. 平衡二叉树:左右子树的高度差不超过1,能够保证二叉树的查找效率,常见的平衡二叉树有AVL树和红黑树等。
4. 线索二叉树:在二叉树的节点上增加指向前驱和后继节点的指针,可以提高二叉树的遍历效率。
5. 二叉排序树:也称为二叉搜索树,左子树上的节点都比根节点小,右子树上的节点都比根节点大,可以用于快速查找和排序。
以上是二叉树的五种基本形态,每种形态都有其特定的应用场景和优缺点,在实际应用中需要根据具体情况选择合适的形态。
- 1 -
二叉树的快速排序、归并排序方法
二叉树的快速排序、归并排序方法
一、快速排序
快速排序采用的是分治法策略,其基本思路是先选定一个基准数(一般取第一个元素),将待排序序列抽象成两个子序列:小于基准数的子序列和大于等于基准数的子序列,然后
递归地对这两个子序列排序。
1. 递归实现
(1)选定基准数
题目要求采用第一个元素作为基准数,因此可以直接将其取出。
(2)划分序列
接下来需要将待排序序列划分成两个子序列。
我们定义两个指针 i 和 j,从待排序序列的第二个元素和最后一个元素位置开始,
分别向左和向右扫描,直到 i 和 j 相遇为止。
在扫描过程中,将小于等于基准数的元素移到左边(即与左侧序列交换),将大于基
准数的元素移到右边(即与右侧序列交换)。当 i=j 时,扫描结束。
(3)递归排序子序列
完成划分后,左右两个子序列就确定了下来。接下来分别对左右两个子序列递归调用
快速排序算法即可。
2. 非递归实现
上述方法是快速排序的递归实现。对于大量数据或深度递归的情况,可能会出现栈溢
出等问题,因此还可以使用非递归实现。
非递归实现采用的是栈结构,将待排序序列分成若干子序列后,依次将其入栈并标注
其位置信息,然后将栈中元素依次出栈并分割、排序,直至栈为空。
二、归并排序
归并排序同样采用的是分治思想。其基本思路是将待排序序列拆分成若干个子序列,
直至每个子序列只有一个元素,然后将相邻的子序列两两合并,直至合并成一个有序序
列。
1. 递归实现
(1)拆分子序列
归并排序先将待排序序列进行拆分,具体方法是将序列平分成两个子序列,然后递归地对子序列进行拆分直至每个子序列只剩下一个元素。
二叉树
平衡树——特点:所有结点左右子树深度差≤1
排序树——特点:所有结点―左小右大
字典树——由字符串构成的二叉排序树
判定树——特点:分支查找树(例如12个球如何只称3次便分出轻重)
带权树——特点:路径带权值(例如长度)
最优树——是带权路径长度最短的树,又称Huffman树,用途之一是通信中的压缩编码。
1.1 二叉排序树:
或是一棵空树;或者是具有如下性质的非空二叉树:
(1)若左子树不为空,左子树的所有结点的值均小于根的值;
(2)若右子树不为空,右子树的所有结点均大于根的值;
(3)它的左右子树也分别为二叉排序树。
例:二叉排序树如图9.7:
二叉排序树的查找过程和次优二叉树类似,通常采取二叉链表作为二叉排序树的存储结构。中序遍历二叉排序树可得到一个关键字的有序序列,一个无序序列可以通过构造一棵二叉排序树变成一个有序序列,构造树的过程即为对无序序列进行排序的过程。每次插入的新的结点都是二叉排序树上新的叶子结点,在进行插入操作时,不必移动其它结点,只需改动某个结点的指针,由空变为非空即可。搜索,插入,删除的复杂度等于树高,期望O(logn),最坏O(n)(数列有序,树退化成线性表).
虽然二叉排序树的最坏效率是O(n),但它支持动态查询,且有很多改进版的二叉排序树可以使树高为O(logn),如SBT,AVL,红黑树等.故不失为一种好的动态排序方法.
2.2 二叉排序树b中查找
在二叉排序树b中查找x的过程为:
1. 若b是空树,则搜索失败,否则:
2. 若x等于b的根节点的数据域之值,则查找成功;否则:
3. 若x小于b的根节点的数据域之值,则搜索左子树;否则:
算法(平衡二叉树)
算法(平衡⼆叉树)
科普⼆叉树
⼆叉树
⼆叉数是每个节点最多有两个⼦树,或者是空树(n=0),或者是由⼀个根节点及两个互不相交的,分别称为左⼦树和右⼦树的⼆叉树组成满⼆叉树
有两个⾮空⼦树(⼆叉树中的每个结点恰好有两个孩⼦结点切所有叶⼦结点都在同⼀层)
也就是⼀个结点要么是叶结点,要么是有两个⼦结点的中间结点。
深度为k且含有2^k-1个结点的⼆叉树
完全⼆叉树
从左到右依次填充
从根结点开始,依次从左到右填充树结点。
除最后⼀层外,每⼀层上的所有节点都有两个⼦节点,最后⼀层都是叶⼦节点。
平衡⼆叉树
AVL树
[3,1,2,5,9,7]
⾸先科普下⼆叉排序树⼜称⼆叉查找树,议程⼆叉搜索树
⼆叉排序树的规则
⽐本⾝⼤放右边,⽐本⾝⼩放左边
平衡⼆叉数
⾸先是⼀个⼆叉排序树
左右两个⼦树的⾼度差不⼤于1
下⾯图中是平衡的情况
下⾯是不平衡的情况
引⼊公式
(LL)右旋
function toateRight(AvlNode){
let node=AvlNode.left;//保存左节点 AvlNode.left=node.right;
node.right=AvlNode;
}
(RR)左旋
function roateLeft(AvlNode){
let node=AvlNode.right;//保存右⼦节点
AvlNode.right=node.left;
node.left=AvlNode;
return node;
}
左右旋
⼤图
判断⼆叉树是不是平衡树
⼆叉树任意结点的左右⼦树的深度不超过1
深度计算
定义⼀个初始化的⼆叉树
var nodes = {
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
沈阳航空航天大学
课程设计报告
课程设计名称:数据结构课程设计课程设计题目:二叉排序树算法
院(系):计算机学院
专业:计算机科学与技术
班级:04010103
学号:2010040101097
姓名:郭胜龙
指导教师:丁一军
此页为任务书
目录
1 课程设计介绍 (1)
1.1课程设计内容 (1)
1.2课程设计要求 (1)
2 课程设计原理 (2)
2.1课设题目粗略分析 (2)
2.2原理图介绍 (2)
2.2.1 功能模块图 (2)
2.2.2 main(主函数) (2)
2.2.3 SearchBST(查找) (3)
2.2.4 InsertBST(插入) (4)
2.2.5 CreatBST(建立) (4)
2.2.6 DeleteBST(删除) (4)
2.2.7 PreOrder(先序遍历) (5)
2.2.8 InOrder(中序遍历) (5)
3 数据结构分析 (7)
3.1存储结构 (7)
3.2算法描述 (7)
4 调试与分析 (12)
4.1调试过程 (12)
4.2程序执行过程 (12)
参考文献 (15)
附录(关键部分程序清单) (16)
沈阳航空航天大学课程设计报告
1 课程设计介绍
1.1 课程设计内容
题目内容:
1.构造二叉排序树;
2.输出该二叉排序树的先序、中序遍历序列;
3.删除该二叉排序树的任意一个结点;
4.输出删除后的二叉排序树的先序、中序遍历序列。
1.2课程设计要求
题目要求:
1.按要求建立不同的二叉排序树;
2.数据自定
3.独立完成课程设计任务
2 课程设计原理
2.1
课设题目粗略分析
根据课设题目要求,拟将整体程序分为七大模块。以下是七个模块的大体分
析:
main ():主函数模块
SearchBST ():查找相应的结点 InsertBST1():插入一个新的结点 CreatBST ():创建一棵二叉排序树 DeleteNode ():删除结点
PreOrder ()对二叉排序树进行先序遍历 InOrder ()对二叉排序树进行中序遍历
2.2 原理图介绍
2.2.1 功能模块图
图2.2.1 功能模块结构图
2.2.2 main (主函数)
功能:连接各个函数,确定他们的执行顺序和条件。
二叉排
序树算法
主模块
查找模块 插入模块 建立模块 删除模块 先序遍历模块 中序遍历模块
图2.2.2主函数流程图
2.2.3 SearchBST (查找)
功能:查找相应的结点。
图2.2.3 查找操作的流程图
开始
选择功能
Choose=1 建立二叉排序树
Choose=2 删除x 结点
Choose=3 先序遍历二叉排
Choose=0 退出
Choose=4 中序遍历二叉排
A
结束
A
Y
Y
开始
T->data==key s=T
T->data>key
s=SearchBST(T->rchild)
s=SearchBST(T->lchild)
N
N
返回s
结束
2.2.4 InsertBST (插入)
功能:插入一个新的结点。
图2.2.4 插入操作的流程图
2.2.5 CreatBST (建立)
功能:建立一个已知数据的二叉排序树。
图2.2.5 建立操作的流程图
2.2.6 DeleteBST (删除)
功能:删除值为x 的结点。
Y
Y
开始
T==NULL T=s
s->data>T->data
s=InserBST(T->r
child)
s=InsertBST(T->l
child)
N
N
结束
开始
输入结点数n
调用插入函数
结束
开始
调用查找函数
删除p结点
右子树连在左
子树上
左子树连在p
结点的父母节
点上
结束
图2.2.6 删除操作的流程图2.2.7 PreOrder(先序遍历)
功能:对二叉排序树进行先序遍历,并输出序列。
开始
访问T
PreOrder(T->rchild)
PreOrder(T->lchild)
结束
图2.2.7 先序遍历的流程图2.2.8 InOrder(中序遍历)
功能:对二叉排序树进行先序遍历,并输出序列。
开始
InOrder(T->rchild)
访问T
InOrder(T->lchild)
结束
图2.2.8 中序遍历的流程图
沈阳航空航天大学课程设计报告错误!未指定书签。
3 数据结构分析
3.1 存储结构
定义一个链表式的二叉排序树,用链表的方式构造结点,存储二叉排序树中的结点、结点类型和指针类型如下:
typedef struct BiTNode
{
int data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
3.2 算法描述
1、二叉排序树的查找算法
(1)若二叉排序树为空,则查找失败。
(2)否则,将根结点的关键字与待查关键字进行比较,若相等,则查找成功;若根节点关键字大于待查值,则进入左子树重复次步骤,否则,进入右子树进行此步骤;若在查找过程中遇到二叉排序树的叶子节点时,还没有找到待查节点,则查找不成功。
算法如下:
BiTree SearchBST1(BiTree T, int key)
{//在根指针T所指二叉排序树中递归查找关键字等于 key 的数据元素
//若成功,返回指向该数据元素结点的指针,否则返回空指针;s为返回 //指针
BiTree s;
if(T==NULL) return NULL;
else if(T->data==key) s=T;
else if(T->data>key) //key大于当前结点的关键字,则查找左子树