特殊树结构及其应用

特殊树结构及其应用
特殊树结构及其应用

特殊树结构及其应用

一、二叉排序树

我们已经很熟悉各种排序算法了,现在的问题是:是否可以利用二叉树的有序性进行快速排序和插入、查找操作呢?答案是肯定的,这样的二叉树就称为二叉排序树(或二叉查找树)。二叉排序树具有这样的性质:任何结点的值都大于它左子树上结点的值,小于右子树上结点的值,然后采用中序遍历就可以生成一个有序序列。

图1所示的二叉排序树,中序遍历结果为:5,6,8,9,10,11,13,14,15,17。

如何生成这样的一棵二叉树呢?

图1

例1、编程输入一组不同的整数(约定大于等于0,输入负数表示结束),用二叉排序树排序后按从小到大输出。

[问题分析]

先生成一个结点,再根据大小决定这个结点是插在左子树上还是右子树上,如此重复直到输入一个负数。

[参考程序]

Program p1(Input, Output);

Type tree=^node;

node=Record

data:Integer;

lchild,rchild:tree;

End;

Var bt:tree;

n:Integer;

Procedure creat_order_tree(Var btx:tree;nx:Integer); {排序二叉树的插入} Var p,s,f:tree;

flag:Boolean;{标识要插入的数是否在树中出现过,防止同一个数重复出现在树中} Begin

New(s);s^.data:=nx;s^.lchild:=Nil;s^.rchild:=Nil; {新建一个结点s}

flag:=True; {假设没出现过}

p:=btx; {P指向根结点}

While (p<>Nil) And flag Do {为结点S找插入位置、同时判断是否出现过} Begin

f:=p;

If s^.data=p^.data Then flag:=False {出现过做标记}

Else If s^.data

Else p:=p^.rchild; {沿由子树方向找} End;

If flag Then Begin

{没出现过、且p=Nil说明已找到叶结点了,那么插入到叶结点的左右孩子中} If btx=Nil Then btx:=s; {作为根结点}

If s^.data

If s^.data>f^.data Then f^.rchild:=s; {右孩子}

End;

End;

Procedure inorder_print(btx:tree); {递归中序输出}

Begin

If btx<>Nil Then

Begin

inorder_print(btx^.lchild); {从小到大输出,如果要求从大到小,

Write(btx^.data,’‘);只要先右再左就可以了 } inorder_print(btx^.rchild);

End;

End;

Begin {主程序}

bt:=Nil; { 根结点初始化,不指向任何结点}

Writeln(‘input data(if <0 then over!):’);

Repeat {不断输入正数,不断插入}

Read(n);If n>=0 Then creat_order_tree(bt,n);

Until n<0;

Write(‘output sorted data:’);

inorder_print(bt);

Writeln;

End.

注:以上creat_order_tree过程也可改成递归过程,方法如下:

Procedure insert(Var btx:tree;nx:Integer);

Begin

New(s); s^.data:=nx ; s^.lchild:=Nil ; s^.rchild:=Nil ;

If btx=Nil Then btx:=s {作为根结点}

Else If s^.data

Then insert(btx^.lchild,nx) {插到左子树}

Else If s^.data>btx^.data Then insert(btx^.rchild,nx);

{插到右子树;再否则,即相等则什么也不做,跳过}

End ;

二、哈夫曼树

哈夫曼树(Huffman Tree ),又称最优树,是一类带权路径长度最短的树,有着广泛的应用,在这里我们将要讨论哈夫曼二叉树(最优二叉树)的概念及其算法。

我们知道,从树中一个结点到另一个结点之间的分支构成这两个结点之间的路径,路径上的分支数目称做路径长度。树的路径长度是从树根到每一个结点的路径长度之和。带权二叉树是指每个结点都带有一个权值的二叉树。

可以证明:路径长度最短的二叉树一定是一棵完全二叉树。

若将路径长度的概念推广到一般情况,考虑带权的结点。结点的带权路径长度为从该结点到树根之间的路径长度与结点上权的乘积。树的带权路径长度为树中所有叶子结点的带权路径长度之和,通常记作: WPL=

∑=n

k k

k

L

W 1

(W k 、L k 分别为第k 个结点的权值和路径长度)。

找到一个使WPL 最小的二叉树,是解决最优问题的关键。

假设有n 个权值(w 1,w 2,…,w n ),试构造一棵有n 个叶子结点的二叉树,每个叶子结点权值为w i ,则其中带权路径长度WPL 最小的二叉树就是“最优二叉树或哈夫曼二叉树”。哈夫曼二叉树最主要的特点是,叶子的权越大就应该越靠近根结点,权越小就应该越远离根结点,因此哈夫曼树又称为最优叶子二叉树。

如何构造哈夫曼二叉树呢?D ·A ·Huffman 给出了一个简单而又漂亮的算法,这个算法称为哈夫曼算法,它的基本思想就是让权大的叶子离根最近,具体做法是:

(1)根据给定的n 个权值{w 1,w 2,…,w n },构造n 棵二叉树的集合F ={T 1,T 2,…,T n },其

中每棵二叉树中均只含一个带权值为w i 的根结点,其左、右子树为空树; (2)在F 中选取其根结点的权值为最小的两棵二叉树,分别作为左、右子树构造一棵新的

二叉树,并置这棵新的二叉树根结点的权值为其左、右子树根结点的权值之和; (3)从F 中删去这两棵树,同时加入刚生成的新树; (4)重复(2)和(3)两步,直到F 中只含一棵树为止。

从上述算法中可以看出,F 实际上是森林,算法的目的是不断地对森林中的二叉树进行“合并”,最终得到哈夫曼二叉树。

如何从程序实现哈夫曼算法呢?这与实际问题所采用的存储结构有关,现假设用数组F

来存储哈夫曼二叉树,其中第i个数组元素F[i]是哈夫曼二叉树中的一个结点,其地址为i,有3个域,Data域存放该结点的权值,lChild域和rChild域分别存放该结点左、右子树的根结点的地址(下标)。在初始状态下:

F[i].Data=W i ;F[i].lChild=0;F[i].rChild=0 (i=1,2,…,n)即先构造好n个叶子结点,以后每步构造一棵新的二叉树时,都对森林中所有二叉树的根结点进行排序,因此可用数组a作为排序暂存空间,其中第i个数组元素a[i]是森林中第i棵二叉树的根结点,有2个域,Data是根结点所对应的权值,Addr是根结点在F中的地址(下标),在初始状态下:

a[i].Data=W i ;a[i].Addr=I (i=1,2,…n)

下面给出建立哈夫曼二叉树的过程:

Procedure createhuffmantree(f,t,a,n) { 已知n个权值a[i],构造哈夫曼树f,Var i:Integer;且根结点地址为t } Begin

For i:=1 To n Do Begin {初始化}

f[i].data:=a[i].data;

f[i].lchild:=0;

f[i].rchild:=0;

a[i].addr:=i

End;

t:=n+1;{t指向下一个可利用单元}

i:=n;{当前森林中的二叉树是i}

While i>=2 Do Begin

insert(a,i);{对a的前i个元素按data域进行排序}

f[t].data:=a[1].data+a[2].data;{生成新的二叉树}

f[t].lchild:=a[1].addr;

f[t].rchild:=a[2].addr;

a[1].data:=f[t].data;{修改森林}

a[1].addr:=t;

a[2].data:=a[i].data;{修改森林}

a[2].addr:=a[i].add;

i:=i-1;{二叉树数目减一}

t:=t+1;

End;

End;

三、堆结构

堆结构是一种数组对象,它可以被视为一棵完全二叉树,树中每个结点与数组中存放该结点中值的那个元素相对应,如图2:

图2

左边的图(a)是一棵典型的完全二叉树,结点上方为编号,结点的值在圆圈当中。右

边的图(b)是我们非常熟悉的一维数组,当又不是一般意义上的数组,因为这个数组存储了左

边的二叉树结构。表示一个堆的数组具有以下一些属性:设数组A的长度为len,二叉树的

结点个数为size,size≤len,则A[i]存储二叉树中编号为i的结点值(1≤i≤size),而

A[size]以后的元素并不属于相应的堆,树的根为A[1],并且利用完全二叉树的性质,我们

很容易求第i个结点的父结点(parent(i))、左孩子结点(left(i))、右孩子结点(right(i))

的下标了,分别为:trunc(i/2)、2i、2i+1;

更重要的是,堆具有这样一个性质,对除根以外的每个结点i,A[parent(i)]≥A[i]。

即除根结点以外,所有结点的值都不得超过其父结点的值,这样就推出,堆中的最大元素存

放在根结点中,且每一结点的子树中的结点值都小于等于该结点的值,这种堆又称为“大根

堆”;反之,对除根以外的每个结点i,A[parent(i)]≤A[i]的堆,称为“小根堆”。

如何构建一个初始(大根)堆?首先所有叶结点(编号为trunc(N/2)+1到N)都各自成

堆,我们只要从最后一个分支结点(编号为trunc(N/2))开始,不断“调整”每个分支结点

与孩子结点的值,使它们满足堆的要求,直到根结点为止,这样一定能确保根(堆顶元素)

“调整”的思想如下:即如果当前结点编号为i, 则它的左孩子为2*i, 右孩子2*i+1,的值最大。

首先比较A[i]与MAX(A[2*i],A[2*i+1]);如果A[i]大,说明以结点i为根的子树已经是

堆,不用再调整。否则将结点i和左右孩子中值大的那个结点j互换位置,互换后可能破坏

以j为根的堆,所以必须再比较A[j] 与MAX(A[2*j],A[2*j+1]),依此类推,直到父结点

的值大于等于两个孩子或出现叶结点为止。这样,以i为根的子树就被调整成为一个堆。

编写的子程序如下:

Procedure heap(Var r:arrtype;nn,ii:Integer);

Var x,i,j:Integer;

Begin

i:=ii;

x:=r[ii]; {把待调整的结点值暂存起来}

j:=2*ii; {j为ii的左孩子编号,初始时假设它比右孩子的值大}

While j<=nn Do

Begin

If (j

If x

Else j:=nn+1; {故意让j超出范围,终止循环}

End;

r[i]:=x; {调整到最终位置}

End;

有时需要在建好的一个堆(设关键码值为h[1],h[2],……h[n-1])中再插入一个结点(关键码值为h[n]),变成一个新的堆(关键码值为h[1],h[2],……h[n])。插入的方法如下:设大根堆中的每个结点编号为:根结点编号为1,编号为i的结点其左右子女的编号为2i和2i+1。因为堆中的任何一个非叶结点的关键码都大于或等于它的子女结点的关键码,所以对新插入的结点h[n],只需将它与父结点h[n div 2]进行比较,如果大于父结点的关键码,则交换两个结点的位置。对新结点的当前位置,再将它与父结点比较,……,重复这一过程,直至到达根或找到一个较大的结点为止。用这种方法也可以边输入数据,边调整建堆。

有时需要在建好的一个堆(设关键码值为h[1],h[2],……h[n])中删除某一个结点(设关键码值为h[i]),变成一个新的堆(关键码值为h[1],h[2],……h[n-1])。删除的方法如下:首先用关键码值h[n]代替h[i]的值,然后用上述不断调整的方法使得h[1],h[2],……h[n-1]形成一个新的堆。

四、作业(只要交源程序,每题每个测试点的时限都是1秒)

题1、小球(满分5分,10个测试点)

源程序名 drop.???(pas,c,cpp)

输入文件名 drop.in

输出文件名 drop.out

问题描述

许多的小球一个一个的从一棵满二叉树上掉下来组成FBT(Full Binary Tree,满二叉树),每一时间,一个正在下降的球第一个访问的是非叶子节点。然后继续下降时,或者走右子树,或者走左子树,直到访问到叶子节点。决定球运动方向的是每个节点的布尔值。最初,所有的节点都是FALSE,当访问到一个节点时,如果这个节点是FALSE,则这个球把它变成TRUE,然后从左子树走,继续它的旅程。如果节点是TRUE,则球也会改变它为FALSE,而接下来从右子树走。满二叉树的标记方法如图1。

图1

因为所有的节点最初为FALSE,所以第一个球将会访问节点1,节点2和节点4,转变节点的布尔值后在在节点8停止。第二个球将会访问节点1、3、6,在节点12停止。明显地,

第三个球在它停止之前,会访问节点1、2、5,在节点10停止。

现在你的任务是,给定FBT的深度D,和I,表示第I个小球下落,你可以假定I不超过给定的FBT的叶子数,写一个程序求小球停止时的叶子序号。

输入

输入文件仅一行,包含两个用空格隔开的整数D和I。其中2<=D<=20,1<=I<=524288。

输出

输出文件仅一行,对应输出第I个小球下落停止时的叶子序号。

样例

DROP.IN

4 2

DROP.OUT

12

题2、合成陨石(满分5分,10个测试点)

源程序名 aerolite.??? (pas,c,cpp)

输入文件名 aerolite.in

输出文件名 aerolite.out

问题描述

czyz大学化学系的学生们最近发现了一种奇怪的陨石,这些陨石通过化学反应合成,会放出惊人的破坏力量。为了储存方便,化学系的学生们决定把这些陨石碎块合成一个大的陨石块。每一次合并,可以把两个陨石合成一个,放出的破坏能量是两个陨石的质量之和,而新产生的陨石质量是这两个陨石的质量之和。

为了将这次试验的破坏效果减少到最低,他们想请你帮忙,计算一下可以达到的最小破坏能量值。

例如有3个陨石碎片,质量依次为1,2,9。可以先将1、2合并,新陨石为3,放出的破坏能量为3。接着,将新陨石与原先的3合并,又得到新的陨石,质量为12,放出的破坏能量为12。所以总共放出的破坏能量=3+12=15。可以证明15为最小的破坏能量值。

输入

输入文件包括两行,第一行是一个整数n(1<=n<=10000),表示陨石的个数。第二行包含n个整数,用一个空格分隔,第i个整数ai(1<=ai<=20000)是第i个陨石的质量。

输出

输出文件只有一行一个整数,也就是最小的破坏能量值。输入数据保证这个值小于2^31。

样例输入

3

1 2 9

样例输出

15

数据限制

保证30%数据,n<=1000;

保证50%数据,n<=5000;

保证100%数据,n<=10000;

题3、排序二叉树(满分10分,10个测试点)

源程序名tree.??? (pas,c,cpp)

输入文件名 tree.in

输出文件名 tree.out

问题描述

一个边长为n的正三角形可以被划分成若干个小的边长为1的正三角

形,称为单位三角形。如右图,边长为3的正三角形被分成三层共9个小

的正三角形,我们把它们从顶到底,从左到右以1~9编号(见右图)。同理,

边长为n的正三角形可以划分成n2个单位三角形。

四个这样的边长为n的正三角形可以组成一个三棱锥。我们将

正三棱锥的三个侧面依顺时针次序(从顶向底视角)编号为A, B, C,

底面编号为D。侧面的A, B, C号三角形以三棱锥的顶点为顶,底

面的D号三角形以它与A, B三角形的交点为顶。左图为三棱锥展开

后的平面图,每个面上标有圆点的是该面的顶,该图中侧面A,B,C 分别向纸内方向折叠即可还原成三棱锥。我们把这A、B、C、D四个面各自划分成n2个单位三角形。

对于任意两个单位三角形,如有一条边相邻,则称它们为相邻的单位三角形,显然,每个单位三角形有三个相邻的单位三角形。现在,把1~4n2分别随机填入四个面总共4n2个单位三角形中。

现在要求你编程求由单位三角形组成的最大排序二叉树。所谓最大排序二叉树,是指在所有由单位三角形组成的排序二叉树中节点最多的一棵树。对于任一单位三角形,可选它三个相邻的单位三角形中任意一个作为父节点,其余两个分别作为左孩子和右孩子。当然,做根节点的单位三角形不需要父节点,而左孩子和右孩子对于二叉树中的任意节点来说并不是都必须的。

输入

输入文件第一行是一个整数n(1<=n<=18),随后4n2行,依次为三棱锥四个面上所填的数字。

输出

输出文件仅包含一个整数,表示最大的排序二叉树所含的节点数目。

样例

输入文件对应下图:

A面 B面 C面 D面

作业说明:

1、请在5月 10日之前提交作业,否则按“未交”处理;

2、本次作业只要交3个源程序,请严格按照题目规定的程序名、输入输出文件名、输入输出格式要求做,只要交源程序即可。

3、提交作业时,要把自己的3个源程序放在一个文件夹里(文件夹的名字为“市+学生姓名”),压缩成一个压缩文件后通过JSOI网站上的“上传作业”提交。如常州市正衡中学邹晨同学,提交的压缩文件应该是:常州邹晨.rar,解压后得到的文件夹应该是“常州邹晨”,里面有drop.pas、aerolite.pas和tree.pas三个文件。

4、作业要独立完成,一旦发现雷同,则雷同的人全部按0分处理。可以在JSOI论坛上讨论、交流,方法思路一样没什么,但程序必须要自己独立完成。

5、本次作业满分20分。

二年级上册知识结构图

正 方 体 和 长 方 体 编写体例 编写特点 内容结构 评价建议 课程资源 开发建议课程目标 一.说课标 教学建议 三.说建议 课程内容 立体整合 二.说教材

小学数学二年级上册知识结构图 数与代数图形与几何统计与概率综合与实践 数的运算探索规律 常见的 量图形的 认识 测量图形与 变换 图形与 位置 我长高 了 看一 看 摆一 摆 100以内的加减法笔算、估算厘米 和米 认识 线段 用直尺、 三角板测 量 对称图形 对称轴 镜面 对称 从不同 位置观 察物体 简单的 排列和 组合 简单的 推理 认识角 条形 统计图 统计的 意义 表内乘法

数的认 识 数的运算 式与方程 比和比例 常见的量 探索规律 线与角 平面图形 立体图 形 图形与变换 统 计 可能性 一般复合应用题 典型应用题 分数百分数应用题 比和比例应用题 自然数整数 小数 分数 百分 数 数的 整除 四则运算法则 四则 运算顺序 简便运算 含有字母的式子 方程与解方程 比比例比例尺 比的基 本性质 求比 值化 简比 解比例 质量单位 长度单位 面积单位 体积单位 时间单位 单位之间的换算 线 角 线段 直 线 射线 (锐、直、钝、平、周) 三角形 四边形 圆形 和扇 形 长 方体 正方体 圆柱和圆锥 位置变换 大小变换 平移变换 旋转变换 对称变换 按比例将图形放大 按比例将图形缩小 统计表 统计图 单式 复式 折线统计图 扇形统计图 小学数学课程内 容 数与代数 图形与几何 统计与概率 综合与实践 一、说课标之课程总内容 条形统计图

为六年级学习圆柱的体积打下基 础。 一上 一年级上册渗 透物体和图形 直观认识(体与形) 二下 三 下 四 上 四年级上册是认识 平行四边形和梯形 四下 四年级下册是认识三角形 五下 六年级上册圆的周长及面积计算 六下 六年级下册圆柱 体表面积、体积 计算、圆锥体的 体积计算 第一学段 第二学段 五年级上册三角形、 三角形、 平等四边形、 五上 三年级下册长方形与正方形的面积 三 上 一年级下册初步认识长方形和正方形的特征 二年级下册锐角钝角 三年级上册长方形与正方形的周长

数据结构-第六章-图-练习题及答案详细解析(精华版)

图 1. 填空题 ⑴ 设无向图G中顶点数为n,则图G至少有()条边,至多有()条边;若G为有向图,则至少有()条边,至多有()条边。 【解答】0,n(n-1)/2,0,n(n-1) 【分析】图的顶点集合是有穷非空的,而边集可以是空集;边数达到最多的图称为完全图,在完全图中,任意两个顶点之间都存在边。 ⑵ 任何连通图的连通分量只有一个,即是()。 【解答】其自身 ⑶ 图的存储结构主要有两种,分别是()和()。 【解答】邻接矩阵,邻接表 【分析】这是最常用的两种存储结构,此外,还有十字链表、邻接多重表、边集数组等。 ⑷ 已知无向图G的顶点数为n,边数为e,其邻接表表示的空间复杂度为()。 【解答】O(n+e) 【分析】在无向图的邻接表中,顶点表有n个结点,边表有2e个结点,共有n+2e个结点,其空间复杂度为O(n+2e)=O(n+e)。 ⑸ 已知一个有向图的邻接矩阵表示,计算第j个顶点的入度的方法是()。 【解答】求第j列的所有元素之和 ⑹ 有向图G用邻接矩阵A[n][n]存储,其第i行的所有元素之和等于顶点i的()。 【解答】出度

⑺ 图的深度优先遍历类似于树的()遍历,它所用到的数据结构是();图的广度优先遍历类似于树的()遍历,它所用到的数据结构是()。 【解答】前序,栈,层序,队列 ⑻ 对于含有n个顶点e条边的连通图,利用Prim算法求最小生成树的时间复杂度为(),利用Kruskal 算法求最小生成树的时间复杂度为()。 【解答】O(n2),O(elog2e) 【分析】Prim算法采用邻接矩阵做存储结构,适合于求稠密图的最小生成树;Kruskal算法采用边集数组做存储结构,适合于求稀疏图的最小生成树。 ⑼ 如果一个有向图不存在(),则该图的全部顶点可以排列成一个拓扑序列。 【解答】回路 ⑽ 在一个有向图中,若存在弧、、,则在其拓扑序列中,顶点vi, vj, vk的相对次序为()。 【解答】vi, vj, vk 【分析】对由顶点vi, vj, vk组成的图进行拓扑排序。 2. 选择题 ⑴ 在一个无向图中,所有顶点的度数之和等于所有边数的()倍。 A 1/2 B 1 C 2 D 4 【解答】C 【分析】设无向图中含有n个顶点e条边,则。

数据结构树和二叉树实验报告

《数据结构》课程实验报告 实验名称树和二叉树实验序号 5 实验日期 姓名院系班级学号 专业指导教师成绩 教师评语 一、实验目的和要求 (1)掌握树的相关概念,包括树、结点的度、树的度、分支结点、叶子结点、儿子结点、双亲结点、树 的深度、森林等定义。 (2)掌握树的表示,包括树形表示法、文氏图表示法、凹入表示法和括号表示法等。 (3)掌握二叉树的概念,包括二叉树、满二叉树和完全二叉树的定义。 (4)掌握二叉树的性质。 (5)重点掌握二叉树的存储结构,包括二叉树顺序存储结构和链式存储结构。 (6)重点掌握二叉树的基本运算和各种遍历算法的实现。 (7)掌握线索二叉树的概念和相关算法的实现。 (8)掌握哈夫曼树的定义、哈夫曼树的构造过程和哈夫曼编码产生方法。 (9)掌握并查集的相关概念和算法。 (10)灵活掌握运用二叉树这种数据结构解决一些综合应用问题。 二、实验项目摘要 1.编写一程序,实现二叉树的各种基本运算,并在此基础上设计一个主程序完成如下功能: (1)输出二叉树b; (2)输出H结点的左、右孩子结点值; (3)输出二叉树b的深度; (4)输出二叉树b的宽度; (5)输出二叉树b的结点个数; (6)输出二叉树b的叶子结点个数。 2.编写一程序,实现二叉树的先序遍历、中序遍历和后序遍历的各种递归和非递归算法,以及层次遍历的算法。 三、实验预习内容 二叉树存储结构,二叉树基本运算(创建二叉树、寻找结点、找孩子结点、求高度、输出二叉树)

三、实验结果与分析 7-1 #include #include #define MaxSize 100 typedef char ElemType; typedef struct node { ElemType data; struct node *lchild; struct node *rchild; } BTNode; void CreateBTNode(BTNode *&b,char *str) { BTNode *St[MaxSize],*p=NULL; int top=-1,k,j=0; char ch; b=NULL; ch=str[j]; while (ch!='\0') { switch(ch) { case '(':top++;St[top]=p;k=1; break; case ')':top--;break; case ',':k=2; break; default:p=(BTNode *)malloc(sizeof(BTNode)); p->data=ch;p->lchild=p->rchild=NULL; if (b==NULL) b=p; else { switch(k) { case 1:St[top]->lchild=p;break; case 2:St[top]->rchild=p;break; } } } j++; ch=str[j]; }

最小生成树数据结构课程设计报告

河北科技大学 课程设计报告 学生姓名:白云学号:Z110702301 专业班级:计算机113班 课程名称:数据结构课程设计 学年学期: 2 01 3—2 014学年第2学期指导教师:郑广 2014年6月

课程设计成绩评定表

目录 一、需求分析说明 (1) 1.1最小生成树总体功能要求 (1) 1.2基本功能 (1) 1.3 模块分析 (1) 二、概要设计说明 (1) 2.1设计思路 (1) 2.2模块调用图 (2) 2.3数据结构设计 (2) 2.3.1.抽象数据类型 (2) 2.3.2方法描述 (2) 三、详细设计说明 (3) 3.1主函数模块 (3) 3.2邻接表输出子模块 (3) 3.3邻接矩阵输出子模块 (3) 3.4创建邻接矩阵子模块 (3) 3.5创建邻接表子模块 (3) 3.6 Prim子模块 (3) 3.7 Kruscal子模块 (4) 四、调试分析 (4) 4.1实际完成情况说明 (4) 4.2 出现的问题及解决方案 (4) 4.3程序中可以改进的地方 (4) 六、课程设计总结 (7) 七、测试数据 (7) 八、参考书目 (7)

一、需求分析说明 1.1最小生成树总体功能要求 在n个城市之间建设网络,只需保证连通即可,求最经济的架设方法。存储结构采用多种。求解算法多种。 1.2基本功能 在n个城市之间建设网络,只需要架设n-1条线路,建立最小生成树即可实现最经济的架设方法。 程序可利用克鲁斯卡尔算法或prim算法生成最小生成树。 1.3 模块分析 主模块:用于生成界面和调用各个子模块。 Kruscal模块:以kruscal算法实现最小生成树。 Prim模块:以prim算法实现最小生成树。 邻接表模块:用邻接表方式存储图。 邻接表输出模块:输出邻接表。 邻接矩阵模块:用邻接矩阵方式存储图。 邻接矩阵模块:输出邻接矩阵。 二、概要设计说明 2.1设计思路 问题的解决分别采用普利姆算法以及克鲁斯卡尔算法。 1) 普利姆算法就是先选择根,把它放入一个集合U中,剩余的顶点放在集合V中。然后选择该顶点与V中顶点之间权值最小的一条边,以此类推,如果达到最后一个则返回上一个顶点。 2) 克鲁斯卡尔算法就是写出所有的顶点,选择权最小的边,然后写出第二小的,以此类推,最终要有一个判断是否生成环,不生成则得到克鲁斯卡尔的最小生成树。

第六章树和二叉树习题数据结构

习题六树和二叉树 一、单项选择题 1.以下说法错误的是 ( ) A.树形结构的特点是一个结点可以有多个直接前趋 B.线性结构中的一个结点至多只有一个直接后继 C.树形结构可以表达(组织)更复杂的数据 D.树(及一切树形结构)是一种"分支层次"结构 E.任何只含一个结点的集合是一棵树 2.下列说法中正确的是 ( ) A.任何一棵二叉树中至少有一个结点的度为2 B.任何一棵二叉树中每个结点的度都为2 C.任何一棵二叉树中的度肯定等于2 D.任何一棵二叉树中的度可以小于2 3.讨论树、森林和二叉树的关系,目的是为了() A.借助二叉树上的运算方法去实现对树的一些运算 B.将树、森林按二叉树的存储方式进行存储 C.将树、森林转换成二叉树 D.体现一种技巧,没有什么实际意义 4.树最适合用来表示 ( ) A.有序数据元素 B.无序数据元素 C.元素之间具有分支层次关系的数据 D.元素之间无联系的数据 5.若一棵二叉树具有10个度为2的结点,5个度为1的结点,则度为0的结点个数是()A.9 B.11 C.15 D.不确定 6.设森林F中有三棵树,第一,第二,第三棵树的结点个数分别为M1,M2和M3。与森林F对应的二叉树根结点的右子树上的结点个数是()。 A.M1 B.M1+M2 C.M3 D.M2+M3 7.一棵完全二叉树上有1001个结点,其中叶子结点的个数是() A. 250 B. 500 C.254 D.505 E.以上答案都不对 8. 设给定权值总数有n 个,其哈夫曼树的结点总数为( ) A.不确定 B.2n C.2n+1 D.2n-1 9.二叉树的第I层上最多含有结点数为() A.2I B. 2I-1-1 C. 2I-1 D.2I -1 10.一棵二叉树高度为h,所有结点的度或为0,或为2,则这棵二叉树最少有( )结点A.2h B.2h-1 C.2h+1 D.h+1 11. 利用二叉链表存储树,则根结点的右指针是()。 A.指向最左孩子 B.指向最右孩子 C.空 D.非空 14.在二叉树结点的先序序列,中序序列和后序序列中,所有叶子结点的先后顺序()A.都不相同 B.完全相同 C.先序和中序相同,而与后序不同 D.中序和后序相同,而与先序不同 15.在完全二叉树中,若一个结点是叶结点,则它没()。 A.左子结点 B.右子结点 C.左子结点和右子结点 D.左子结点,右子结点和兄弟结点 16.在下列情况中,可称为二叉树的是()

结构动力特性测试方法及原理

结构动力特性的测试方法及应用(讲稿) 一. 概述 每个结构都有自己的动力特性,惯称自振特性。了解结构的动力特性就是进行结构抗震设 计与结构损伤检测的重要步骤。目前,在结构地震反应分析中,广泛采用振型叠加原理的反应谱分析方法,但需要以确定结构的动力特性为前提。n 个自由度的结构体系的振动方程如下: [][][]{}{})()()()(...t p t y K t y C t y M =+??????+?????? 式中[]M 、[]C 、[]K 分别为结构的总体质量矩阵、阻尼矩阵、刚度矩阵,均为n 维矩阵;{} )(t p 为外部作用力的n 维随机过程列阵;{})(t y 为位移响应的n 维随机过程列阵;{})(t y &为速度响应的n 维随机过程列阵;{})(t y && 为加速度响应的n 维随机过程列阵。 表征结构动力特性的主要参数就是结构的自振频率f (其倒数即自振周期T )、振型Y(i)与阻尼比ξ,这些数值在结构动力计算中经常用到。 任何结构都可瞧作就是由刚度、质量、阻尼矩阵(统称结构参数)构成的动力学系统,结构一旦出现破损,结构参数也随之变化,从而导致系统频响函数与模态参数的改变,这种改变可视为结构破损发生的标志。这样,可利用结构破损前后的测试动态数据来诊断结构的破损,进而提出修复方案,现代发展起来的“结构破损诊断”技术就就是这样一种方法。其最大优点就是将导致结构振动的外界因素作为激励源,诊断过程不影响结构的正常使用,能方便地完成结构破损的在线监测与诊断。从传感器测试设备到相应的信号处理软件,振动模态测量方法已有几十年发展历史,积累了丰富的经验,振动模态测量在桥梁损伤检测领域的发展也很快。随着动态测试、信号处理、计算机辅助试验技术的提高,结构的振动信息可以在桥梁运营过程中利用环境激振来监测,并可得到比较精确的结构动态特性(如频响函数、模态参数等)。目前,许多国家在一些已建与在建桥梁上进行该方面有益的尝试。 测量结构物自振特性的方法很多,目前主要有稳态正弦激振法、传递函数法、脉动测试法与自由振动法。稳态正弦激振法就是给结构以一定的稳态正弦激励力,通过频率扫描的办法确定各共振频率下结构的振型与对应的阻尼比。 传递函数法就是用各种不同的方法对结构进行激励(如正弦激励、脉冲激励或随机激励等),测出激励力与各点的响应,利用专用的分析设备求出各响应点与激励点之间的传递函数,进而可以得出结构的各阶模态参数(包括振型、频率、阻尼比)。脉动测试法就是利用结构物(尤其就是高柔性结构)在自然环境振源(如风、行车、水流、地脉动等)的影响下,所产生的随机振动,通过传感器记录、经谱分析,求得结构物的动力特性参数。自由振动法就是:通过外力使被测结构沿某个主轴方向产生一定的初位移后突然释放,使之产生一个初速度,以激发起被测结构的自由振动。 以上几种方法各有其优点与局限性。利用共振法可以获得结构比较精确的自振频率与阻尼比,但其缺点就是,采用单点激振时只能求得低阶振型时的自振特性,而采用多点激振需较多的设备与较高的试验技术;传递函数法应用于模型试验,常常可以得到满意的结果,但对于尺度很大的实际结构要用较大的激励力才能使结构振动起来,从而获得比较满意的传递函数,这在实际测试工作中往往有一定的困难。 利用环境随机振动作为结构物激振的振源,来测定并分析结构物固有特性的方法,就是近年来随着计算机技术及FFT 理论的普及而发展起来的,现已被广泛应用于建筑物的动力分析研究中,对于斜拉桥及悬索桥等大型柔性结构的动力分析也得到了广泛的运用。斜拉桥或悬索桥的环境随机振源来自两方面:一方面指从基础部分传到结构的地面振动及由于大气变化而影响到上部结构的振动(根据动力量测结果,可发现其频谱就是相当丰富的,具有不同的脉动卓越周期,反应了不同地区地质土壤的动力特性);另一方面主要来自过桥车辆的随机振动。

最小生成树实验报告

数据结构课程设计报告题目:最小生成树问题 院(系):计算机工程学院 学生姓名: 班级:学号: 起迄日期: 指导教师: 2011—2012年度第 2 学期 一、需求分析 1.问题描述:

在n个城市之间建设网络,只需保证连通即可,求最经济的架设方法。存储结构采用多种。求解算法多种。 2.基本功能 在n个城市之间建设网络,只需要架设n-1条线路,建立最小生成树即可实现最经济的架设方法。 程序可利用克鲁斯卡尔算法或prim算法生成最小生成树。 3.输入输出 以文本形式输出最小生成树,同时输出它们的权值。通过人机对话方式即用户通过自行选择命令来输入数据和生成相应的数据结果。 二、概要设计 1.设计思路: 因为是最小生成树问题,所以采用了课本上介绍过的克鲁斯卡尔算法和 prim算法两种方法来生成最小生成树。根据要求,需采用多种存储结构,所以我选择采用了邻接表和邻接矩阵两种存储结构。 2.数据结构设计: 图状结构: ADT Graph{ 数据对象V:V是具有相同特性的数据元素的集合,称为顶点集。 数据关系R:R={VR} VR={|v,w∈V且P(v,w),表示从v到w的弧, 谓词P(v,w)定义了弧的意义或信息} 基本操作: CreateGraph( &G, V, VR ) 初始条件:V是图的顶点集,VR是图中弧的集合。 操作结果:按V和VR的定义构造图G。 DestroyGraph( &G )

初始条件:图G存在。 操作结果:销毁图G。 LocateVex( G, u ) 初始条件:图G存在,u和G中顶点有相同特征。 操作结果:若G中存在顶点u,则返回该顶点在图中位置;否则返 回其它信息。 GetVex( G, v ) 初始条件:图G存在,v是G中某个顶点。 操作结果:返回v的值。 PutVex( &G, v, value ) 初始条件:图G存在,v是G中某个顶点。 操作结果:对v赋值value。 FirstAdjVex( G, v ) 初始条件:图G存在,v是G中某个顶点。 操作结果:返回v的第一个邻接顶点。若顶点在G中没有邻接顶点, 则返回“空”。 NextAdjVex( G, v, w ) 初始条件:图G存在,v是G中某个顶点,w是v的邻接顶点。 操作结果:返回v的(相对于w的)下一个邻接顶点。若w是v的 最后一个邻接点,则返回“空”。 InsertVex( &G, v ) 初始条件:图G存在,v和图中顶点有相同特征。 操作结果:在图G中增添新顶点v。 DeleteVex( &G, v ) 初始条件:图G存在,v是G中某个顶点。 操作结果:删除G中顶点v及其相关的弧。 InsertArc( &G, v, w )

目前最完整的数据结构1800题包括完整答案树和二叉树答案

第6章树和二叉树 部分答案解释如下。 12. 由二叉树结点的公式:n=n0+n1+n2=n0+n1+(n0-1)=2n0+n1-1,因为n=1001,所以1002=2n0+n1,在完全二叉树树中,n1只能取0或1,在本题中只能取0,故n=501,因此选E。 42.前序序列是“根左右”,后序序列是“左右根”,若要这两个序列相反,只有单支树,所以本题的A和B均对,单支树的特点是只有一个叶子结点,故C是最合适的,选C。A或B 都不全。由本题可解答44题。 47. 左子树为空的二叉树的根结点的左线索为空(无前驱),先序序列的最后结点的右线索为空(无后继),共2个空链域。 52.线索二叉树是利用二叉树的空链域加上线索,n个结点的二叉树有n+1个空链域。 部分答案解释如下。 6.只有在确定何序(前序、中序、后序或层次)遍历后,遍历结果才唯一。 19.任何结点至多只有左子树的二叉树的遍历就不需要栈。 24. 只对完全二叉树适用,编号为i的结点的左儿子的编号为2i(2i<=n),右儿子是2i+1(2i+1<=n) 37. 其中序前驱是其左子树上按中序遍历的最右边的结点(叶子或无右子女),该结点无右孩子。 38 . 新插入的结点都是叶子结点。 42. 在二叉树上,对有左右子女的结点,其中序前驱是其左子树上按中序遍历的最右边的结点(该结点的后继指针指向祖先),中序后继是其右子树上按中序遍历的最左边的结点(该结点的前驱指针指向祖先)。 44.非空二叉树中序遍历第一个结点无前驱,最后一个结点无后继,这两个结点的前驱线索和后继线索为空指针。 三.填空题

1.(1)根结点(2)左子树(3)右子树 2.(1)双亲链表表示法(2)孩子链表表示法(3)孩 子兄弟表示法 3.p->lchild==null && p->rchlid==null 4.(1) ++a*b3*4-cd (2)18 5.平衡 因子 6. 9 7. 12 8.(1)2k-1 (2)2k-1 9.(1)2H-1 (2)2H-1 (3)H=?log2N?+1 10. 用顺序存储二叉树时,要按完全二叉树的形式存储,非完全二叉树存储时,要加“虚结 点”。设编号为i和j的结点在顺序存储中的下标为s 和t ,则结点i和j在同一层上的条 件是?log2s?=?log2t?。 11. ?log2i?=?log2j?12.(1)0 (2)(n-1)/2 (3)(n+1)/2 (4) ?log2n?+1 13.n 14. N2+1 15.(1) 2K+1-1 (2) k+1 16. ?N/2? 17. 2k-2 18. 64 19. 99 20. 11 21.(1) n1-1 (2)n2+n3 22.(1)2k-2+1(第k层1个结点,总结点个数是2H-1,其双亲是2H-1/2=2k-2)(2) ?log2i?+1 23.69 24. 4 25.3h-1 26. ?n/2? 27. ?log2k?+1 28.(1)完全二叉树 (2)单枝树,树中任一结点(除最后一个结点是叶子外),只有左子女或 只有右子女。 29.N+1 30.(1) 128(第七层满,加第八层1个) (2) 7 31. 0至多个。任意二叉树,度为1的结点个数没限制。只有完全二叉树,度为1的结点个 数才至多为1。 32.21 33.(1)2 (2) n-1 (3) 1 (4) n (5) 1 (6) n-1 34.(1) FEGHDCB (2)BEF(该二叉树转换成森林,含三棵树,其第一棵树的先根次序是 BEF) 35.(1)先序(2)中序 36. (1)EACBDGF (2)2 37.任何结点至多只有右子女 的二叉树。 38.(1)a (2) dbe (3) hfcg 39.(1) . (2) ...GD.B...HE..FCA 40.DGEBFCA 41.(1)5 (2)略 42.二叉排序树 43.二叉树 44. 前序 45.(1)先根次序(2)中根次序46.双亲的右子树中最左下的叶子结点47.2 48.(n+1)/2 49.31(x的后继是经x的双亲y的右子树中最左下的叶结点) 50.(1)前驱 (2)后 继 51.(1)1 (2)y^.lchild (3)0 (4)x (5)1 (6) y (7)x(编者注:本题按 中序线索化) 52.带权路径长度最小的二叉树,又称最优二叉树 53.69 54.(1)6 (2)261 55.(1)80 (2)001(不唯一)56.2n0-1 57.本题①是表达式求值,②是在二叉排序树中删除值为x的结点。首先查找x,若没有x, 则结束。否则分成四种情况讨论:x结点有左右子树;只有左子树;只有右子树和本身是叶 子。 (1)Postoder_eval(t^.Lchild) (2) Postorder_eval(t^.Rchild) (3)ERROR(无此运 算符)(4)A (5)tempA^.Lchild (6)tempA=NULL(7)q^.Rchild (8)q (9)tempA^.Rchild (10)tempA^.Item

数据结构树和二叉树习题

树与二叉树 一.选择题 1.假定在一棵二叉树中,双分支结点数为15,单分支结点数为30个,则叶子结 点数为()个。 A.15B.16C.17D.47 2.按照二叉树的定义,具有3个结点的不同形状的二叉树有()种。 A. 3 B. 4 C. 5 D. 6 3.按照二叉树的定义,具有3个不同数据结点的不同的二叉树有()种。 A. 5 B. 6 C. 30 D. 32 4.深度为5的二叉树至多有()个结点。1 A. 16 B. 32 C. 31 D. 10 5.设高度为h的二叉树上只有度为0和度为2的结点,则此类二叉树中所包含的 结点数至少为()。 A. 2h B. 2h-1 C. 2h+1 D. h+1 6.对一个满二叉树2,m个树叶,n个结点,深度为h,则()。 A. n=h+m3 B. h+m=2n C. m=h-1 D. n=2 h-1 1深度为n的二叉树结点至多有2n-1 2满二叉树是除最后一层无任何子节点外,每一层上的所有结点都有两个子结点的二叉树7.任何一棵二叉树的叶结点在先序.中序和后序遍历序列中的相对次序()。 A.不发生改变 B.发生改变 C.不能确定 D.以上都不对 8.如果某二叉树的前根次序遍历结果为stuwv,中序遍历为uwtvs,那么该二叉 树的后序为()。 A. uwvts B. vwuts C. wuvts D. wutsv 9.某二叉树的前序遍历结点访问顺序是abdgcefh,中序遍历的结点访问顺序是 dgbaechf,则其后序遍历的结点访问顺序是()。 A. bdgcefha B. gdbecfha C. bdgaechf D. gdbehfca 10.在一非空二叉树的中序遍历序列中,根结点的右边()。 A. 只有右子树上的所有结点 B. 只有右子树上的部分结点 C. 只有左子树上的部分结点 D. 只有左子树上的所有结点 11.树的基本遍历策略可分为先根遍历和后根遍历;二叉树的基本遍历策略可分为 先序遍历.中序遍历和后序遍历。这里,我们把由树转化得到的二叉树4叫做这棵数对应的二叉树。结论()是正确的。 A.树的先根遍历序列与其对应的二叉树的先序遍历序列相同 B.树的后根遍历序列与其对应的二叉树的后序遍历序列相同 3对于深度为h的满二叉树,n=20+21+…+2h-1=2h-1,m=2h-1。故而n=h+m。 4树转化为二叉树的基本方法是把所有兄弟结点都用线连起来,然后去掉双亲到子女的连线,只留下双亲到第一个子女的连线。因此原来的兄弟关系就变为双亲与右孩子的关系。 1/ 9

某装备结构动态特性分析

技术篇 2007年 第十期 某装备结构动态特性分析 霍 红 (中北大学,太原 030051) 摘 要:利用试验模态分析法获得了某机枪结构的模态参数,分析了机枪的动态特性,并通过基于模态试验的灵敏度分析方法,获得了影响该机枪动态特性的敏感部位,为改善机枪动态特性提供了依据. 关键词:机枪;灵敏度分析;动态特性;分析 中图分类号:TP302.7 文献标识码:A 文章编号:1005 8354(2007)10 0001 02 Analysis on structural dyna m ic characteristics for certai n equi p m e nt HUO H ong (N orth U n i ve rs i ty o f Ch i na ,T a i yuan 030051,Chi na) Abstract :A ccor ding to modal analysism etho d,modal parametersw ere derived and structural dynam ic charac teristics were analyzed.U sing sensitivit y analysis of model test ,t he dyna m ic characteristics and sensitive p oints of a m achine gun were obt ained.These woul d be used to i m prove dyna m ic propert y of t hemachine gun. K ey words :machine gun;sensitivity analysis ;struct ural dyna m ic characteristics ;analysis 收稿日期:2007 08 22 作者简介:霍红(1968 ),女,实验师,研究方向:火炮、自动武器与弹药工程. 0 引 言 当今为提高自动武器的机动性,广泛采用弹性枪架,但随着重量的减轻,武器系统的振动加剧.而武器系统的振动又直接影响到射击精度,特别是弹丸出膛 口时的横向位移、横向速度以及弹丸初始扰动等对武器射击精度影响尤其明显 [1] .为此,需掌握武器系统 的固有特性,为分析和优化机枪的动力学特性提供依据,以提高其射击精度.而系统固有特性一般可由理论分析方法和试验方法获得,前者是利用有限元分析法,后者是利用试验模态分析法,随着试验技术的发展和测量仪器精度的提高,利用试验模态分析法得到的结果越来越受到重视,并且常常作为验证有限元模型正确性的主要依据,所以,常采用理论分析和试验两种方法相结合建立模型 [1,2] ,以获得接近实际的结 果,为进一步分析如结构修改设计及结构动力特性优化设计提供良好的基础.本文以某机枪为例,采用试验模态分析法识别机枪系统的模态参数和分析其动 态特性,并在此基础上进行了灵敏度分析,获得机枪动力学特性对各参数变化的灵敏度,为机枪的动力学特性优化设计提供依据. 1 机枪结构试验模态分析 1.1 模态测试系统 模态测试系统基本由以下几部分组成:激励部分、信号测量和数据采集部分、信号分析和频响函数 估计部分 [3] .其测试系统框图见图1所示. 图1 机枪模态试验系统框图 1

数据结构课程设计最小生成树的构建实验报告

《数据结构课程设计》题目二:最小生成树的构建 学院:XXXXXXXXXXX 班级:XXXXXXXXXXX 学号:XXXXXXXXXXX 姓名:XXXXXXXXXXX 设计时间:XXXXXXXXXXX

目录: 1.需求分析--------------------------------------------- 1 2.课题设计内容--------------------------------------- 1 (1)课程设计基本流程------------------------------------------ 1 (2)详细设计说明------------------------------------------------1 (3)界面操作流程图:----------------------------------------- 2 (4)主要程序------------------------------------------------------3 (5)运行结果截图----------------------------------------------- 5 3.得意之处--------------------------------------------- 6 4.设计实践过程中的收获与体会------------------ 6 5.设计目前存在的问题------------------------------ 7 6.主要参考文献-------------------------------------- 7

一、需求分析 本课程主要是完成一个最小生成树的构建,要求用克鲁斯卡尔算法或者普利姆算法求网的最小生成树(此程序我用的是 普利姆算法),并输出各条边及他们的权值。要求用户在使用 时可以准确输入顶点及每个顶点的关系,运算出可以建立的关 系网,最后利用普利姆算法准确输出最短路径。 二、课程设计内容 1、课程设计基本流程: 关于此课程的设计,是从设计要求入手的。根据对知识的掌握程度,我选择了用普利姆算法进行设计。 根据实验要求,我定义了一个prims类,在类中定义一个私有成员函数和一个公有成员函数。定义相关变 量和相关函数,并完善程序。 2、详细设计说明: 首先在私有成员private中定义节点个数n、图中边的个数g,树的边的个数t,源节点s。定义二维数组 graph_edge[99][4]和tree_edge[99][4],分别为图的边 和树的边。因为普利姆算法是把图分为两部分进行运算, 所以我定义了T1[50],t1为第一部分, T2[50],t2为第 二部分。在公有成员public中定义输入函数input()、 算法函数algorithm()、输出函数output()。 1

数据结构—— 树和二叉树知识点归纳

第6章树和二叉树 6.1 知识点概述 树(Tree)形结构是一种很重要的非线性结构,它反映了数据元素之间的层次关系和分支关系。在计算机科学中具有广泛的应用。 1、树的定义 树(Tree)是n(n≥0)个数据元素的有限集合。当n=0时,称这棵树为空树。在一棵非空树T中: (1)有一个特殊的数据元素称为树的根结点,根结点没有前驱结点。 (2)若n>1,除根结点之外的其余数据元素被分成m(m>0)个互不相交的集合T1,T2,…,Tm,其中每一个集合Ti(1≤i≤m)本身又是一棵树。树T1,T2,…,Tm称为这个根结点的子树。 2、树的基本存储结构 (1)双亲表示法 由于树中的每一个结点都有一个唯一确定的双亲结点,所以我们可用一组连续的 存储空间(即一维数组)存储树中的结点。每个结点有两个域:一个是data域,存放结点信息,另一个是parent域,用来存放双亲的位置(指针)。 (2)孩子表示法 将一个结点所有孩子链接成一个单链表形,而树中有若干个结点,故有若干个单 链表,每个单链表有一个表头结点,所有表头结点用一个数组来描述这种方法通常是把每个结点的孩子结点排列起来,构成一个单链表,称为孩子链表。 (3)双亲孩子表示法 双亲表示法是将双亲表示法和孩子表示法相结合的结果。其仍将各结点的孩子结点分别组成单链表,同时用一维数组顺序存储树中的各结点,数组元素除了包括结点本身的信息和该结点的孩子结点链表的头指针之外,还增设一个域,存储该结点双亲结点在数组中的序号。 (4)孩子兄弟表示法 这种表示法又称为树的二叉表示法,或者二叉链表表示法,即以二叉链表作为树的存储结构。链表中每个结点设有两个链域,分别指向该结点的第一个孩子结点和下一个兄弟(右兄弟)结点。 3、二叉树的定义 二叉树(Binary Tree)是个有限元素的集合,该集合或者为空、或者由一个称为根(root)的元素及两个不相交的、被分别称为左子树和右子树的二叉树组成。当集合为空时,称该二叉树为空二叉树。在二叉树中,一个元素也称作一个结点。 4、满二叉树 定义:在一棵二叉树中,如果所有分支结点都存在左子树和右子树,并且所有叶子结点都在同一层上,这样的一棵二叉树称作满二叉树。 5、完全二叉树 定义:一棵深度为k的有n个结点的二叉树,对树中的结点按从上至下、从左到右的顺序进行编号,如果编号为i(1≤i≤n)的结点与满二叉树中编号为i的结点在二叉树中的位置相同,则这棵二叉树称为完全二叉树。完全二叉树的特点是:叶子结点只能出现在最下层和次下层,且最下层的叶子结点集中在树的左部。 6、二叉树的性质

数据结构课程设计报告(最小生成树完整版)

武 夷 学 院 课程设计报告 课程名称: 数据结构 设计题目: 最小生成树的应用 学生班级: 09计科2班 学生姓名: 蒋家权,陈相财,吴继伟,梁丽春 指导教师: 林丽惠 完成日期: 2011-1-19

课程设计项目研究报告 目录 一、问题分析和任务定义....................................................................................... - 1 - 二、实现本程序需要解决的问题如下................................................................... - 1 - 三、测试数据........................................................................................................... - 2 - 四、算法思想........................................................................................................... - 3 - 五、模块划分........................................................................................................... - 4 - 六、算法设计与分析............................................................................................... - 7 - 七、源程序............................................................................................................. - 11 - 八、测试数据......................................................................................................... - 14 - 九、课程设计项目进度表及任务分配表及任务分配表..................................... - 16 - 十、设计心得......................................................................................................... - 17 -十、参考书目......................................................................................................... - 18 -

数据结构实验报告之树与二叉树

学生实验报告 学院:软通学院 课程名称:数据结构与算法 专业班级:软件142 班 姓名:邹洁蒙 学号: 0143990

学生实验报告 (二) 一、实验综述 1、实验目的及要求 目的:1)掌握树与二叉树的基本概念; 2)掌握二叉树的顺序存储,二叉链表的先序遍历中序遍历和后序遍历算法; 3)掌握树的双亲表示法。 要求:1)编程:二叉树的顺序存储实现; 2)编程:二叉链表的先序遍历中序遍历和后序遍历实现; 3)编程:树的双亲表示法实现。 2、实验仪器、设备或软件 设备:PC 软件:VC6 二、实验过程(编程,调试,运行;请写上源码,要求要有注释) 1.编程:二叉树的顺序存储实现 代码: BiTree::BiTree()//建立存储空间 { data = new int[MAXSIZE]; count = 0; } void BiTree::AddNode(int e)//加结点 { int temp = 0; data[count] = e; count++;//从编号0开始保存 }

运行截图: 2.编程:二叉链表的先序遍历中序遍历和后序遍历实现代码: void InOrderTraverse(BiTree* Head)//中序遍历 { if (Head) { InOrderTraverse(Head->LeftChild); cout << Head->data<<" "; InOrderTraverse(Head->RightChild); } } void PreOrderTraverse(BiTree* Head)//先序遍历 { if (Head) { cout << Head->data << " "; PreOrderTraverse(Head->LeftChild); PreOrderTraverse(Head->RightChild); } } void PostOrderTraverse(BiTree* Head)//后序遍历 { if (Head) { PostOrderTraverse(Head->LeftChild); PostOrderTraverse(Head->RightChild); cout << Head->data << " "; } } 运行截图:

数据结构实验报告-最小生成树

电子科技大学 实验报告 学生姓名:XXX 学号:2013220501018指导教师:刘峤 实验地点:信软楼306 实验时间:5月17日 一、实验室名称:软件实验室 二、实验项目名称:数据结构与算法—图 三、实验学时:4 四、实验原理: Kruskal 算法是一种按照图中边的权值递增的顺序构造最小生成树的方法。其基本思想是:设无向连通网为G=(V,E),令G 的最小生成树为T,其初态为T=(V,{}),即开始时,最小生成树T 由图G 中的n 个顶点构成,顶点之间没有一条边,这样T 中各顶点各自构成一个连通分量。然后,按照边的权值由小到大的顺序,考察G 的边集E 中的各条边。若被考察的边的两个顶点属于T 的两个不同的连通分量,则将此边作为最小生成树的边加入到T 中,同时把两个连通分量连接为一个连通分量;若被考察边的两个顶点属于同一个连通分量,则舍去此边,以免造成回路,如此下去,当T 中的连通分量个数为1 时,此连通分量便为G 的一棵最小生成树。 如教材153页的图4.21(a)所示,按照Kruskal 方法构造最小生成树的过程如图 4.21 所示。在构造过程中,按照网中边的权值由小到大的顺序,不断选取当前未被选取的边集中权值最小的边。依据生成树的概念,n 个结点的生成树,有n-1 条边,故反复上述过程,直到选取了n-1 条边为止,就构成了一棵最小生成树。 五、实验目的: 本实验通过实现最小生成树的算法,使学生理解图的数据结构存储表示,并能理解最小生成树Kruskal 算法。通过练习,加强对算法的理解,提高编程能力。 六、实验内容: (1)假定每对顶点表示图的一条边,每条边对应一个权值;

数据结构最小生成树

数据结构 多元化考核作业 题目:最小生成树 姓名:卢伟 专业班级:物联网工程B1501班 学号:

目录 1 课程设计介绍 (3) 1.1 课程设计内容 (3) 1.2 课程设计要求 (3) 2 课程设计原理 (4) 2.1 课设题目粗略分析 (4) 2.2 原理图介绍 (6) 2.2.1 功能模块图 (6) 2.2.2 流程图分析 (7) 3 数据结构分析 (13) 3.1 存储结构 (13) 3.2 算法描述 (13) 4 调试与分析 (14) 4.1 调试过程 (14) 1.2 程序执行过程 (15) 参考文献 (18)

1 课程设计介绍 1.1 课程设计内容 编写算法能够建立带权图,并能够用Kruskal算法求该图的最小生成树。最小生成树能够选择图上的任意一点做根结点。最小生成树输出采用顶点集合和边的集合的形式。 1.2 课程设计要求 1.顶点信息用字符串,数据可自行设定。 2.参考相应的资料,独立完成课程设计任务。 3.交规范课程设计报告和软件代码。

2 课程设计原理 2.1 课设题目粗略分析 根据课设题目要求,拟将整体程序分为三大模块。以下是三个模块的大体分析: 1.要确定图的存储形式,通过对题目要求的具体分析。发现该题的主要操作是路径的输出,因此采用边集数组(每个元素是一个结构体,包括起点、终点和权值)和邻接矩阵比较方便以后的编程。 2.Kruskal算法。该算法设置了集合A,该集合一直是某最小生成树的子集。在每步决定是否把边(u,v)添加到集合A中,其添加条件是A∪{(u,v)}仍然是最小生成树的子集。我们称这样的边为A的安全边,因为可以安全地把它添加到A中而不会破坏上述条件。 3.Dijkstra算法。算法的基本思路是:假设每个点都有一对标号(d j,p j),其中d是从起源点到点j的最短路径的长度(从顶点到其本身的最短路径是零路(没有弧的路),其长度等于零);p j则是从s到j 的最短路径中j点的前一点。求解从起源点s到点j的最短路径算法的基本过程如下: 1)初始化。起源点设置为:①d s=0,p s为空;②所有其它点:d i=∞,p i=?;③标记起源点s,记k=s,其他所有点设为未标记的。2)k到其直接连接的未标记的点j的距离,并设置: d j=min[d j, d k+l kj]

相关文档
最新文档