大学课程数据结构数据结构常见题型.docx

上传人:b****5 文档编号:28407338 上传时间:2023-07-13 格式:DOCX 页数:54 大小:276.25KB
下载 相关 举报
大学课程数据结构数据结构常见题型.docx_第1页
第1页 / 共54页
大学课程数据结构数据结构常见题型.docx_第2页
第2页 / 共54页
大学课程数据结构数据结构常见题型.docx_第3页
第3页 / 共54页
大学课程数据结构数据结构常见题型.docx_第4页
第4页 / 共54页
大学课程数据结构数据结构常见题型.docx_第5页
第5页 / 共54页
点击查看更多>>
下载资源
资源描述

大学课程数据结构数据结构常见题型.docx

《大学课程数据结构数据结构常见题型.docx》由会员分享,可在线阅读,更多相关《大学课程数据结构数据结构常见题型.docx(54页珍藏版)》请在冰豆网上搜索。

大学课程数据结构数据结构常见题型.docx

大学课程数据结构数据结构常见题型

 

数据结构常见解答题

1:

二叉树性质

3的证明

二叉树性质3:

对任何一棵二叉树,若它含有n0个叶子结点、n2个度为2的结点,则

必存在关系式:

n0=n2+1。

证明:

设二叉树中结点总数为n,n1为二叉树中度为1的结点数。

则n=n0+n1+n2

(1)

设二叉树中分支数目为B,因为二叉树中的分支都是由度为1和度为2的结点发出,

所以分支数目为:

B=n1+2n2

(2)

因为除根结点外,每个结点均对应一个进入它的分支,所以有:

n=B+1。

(3)

(1)

(2)代入(3)中,得n0+n1+n2=n1+2n2+1,整理后得n0=n2+1,故结论成立。

2:

已知二叉树先序遍历序列和中序遍历序列画出二叉树(或是已知后序和中序)

例如

已知一棵二叉树的先序序列为ABCDEFGHI

中序序列为:

BCAEDGHFI

试画出二叉树。

先序遍历是根左右,中序是左根右。

做法:

先确定根结点,然后确定左子树的结点,和右子树结点,画出左右子树。

首先,由先序序列可知,结点A是二叉树的根结点。

其次,根据中序序列,在A之前

的所有结点都是根结点左子树的结点,在A之后的所有结点都是根结点右子树的结点,由

此得到图(a)所示的状态。

然后,再对左子树进行分解,得知B是左子树的根结点,又从中

序序列知道,B的左子树为空,B的右子树只有一个结点C。

接着对A的右子树进行分解,

得知A的右子树的根结点为D;而结点D把其余结点分成两部分,即左子树为E,右子树

为F、G、H、I,如图(b)所示。

接下去的工作就是按上述原则对D的右子树继续分解下去,

最后得到如图(c)的整棵二叉树。

 

A

A

A

B

D

B

D

BC

DEF

CE

CE

F

G

I

GHI

FG

IH

H

(a)

(b)

(c)

3:

线索二叉树:

对下图所示的二叉树进行线索化。

A

 

BC

 

DEF

 

G

先序线索:

做法:

先给出二叉树的先序遍历序列

将没有左孩子的结点用虚线指向遍历序列的前驱,将没有右孩子的结点用虚线指向遍历序列的后继。

中序线索与后序线索类似

 

AA

 

BCBC

 

DEFDEF

 

G

 

G

(a)先序线索二叉树

(b)中序线索二叉树

A

 

BC

 

DEF

 

G

(c)后序线索二叉树

4:

树和森林与二叉树的相互转换

转化的二叉树记住左是孩子,右是兄弟。

A

A

B

BD

C

EC

EFG

FD

 

G

转换后的二叉树

森林转换为二叉树

森林转换为二叉树的方法如下:

(1)将森林中的每棵树转换成相应的二叉树。

(2)第一棵二叉树不动,从第二棵二叉树开始,依次把后一棵二叉树的根结点作为前

一棵二叉树根结点的右孩子,当所有二叉树连起来后,此时所得到的二叉树就是由森林转换

得到的二叉树。

A

C

G

A

H

I

B

D

E

F

B

C

J

K

(a)一个森林

D

G

A

C

G

E

H

D

H

B

E

J

I

FJ

I

F

K

K

(b)

森林中每棵树转换为二叉树

(c)所有二叉树连接后的二叉树

 

5:

赫夫曼树构造及赫夫曼编码

赫夫曼树构造:

(1)由给定的n个权值{W1,W2,⋯,Wn}构造n棵只有一个叶结点的二

叉树,从而得到一个二叉树的集合F={T1,T2,⋯,Tn};

(2)在F中选取根结点的权值最小和次小的两棵二叉树作为左、右子树构造一棵新的二叉树,这棵新的二叉树根结点的权值为其左、右子树根结点权值之和;

(3)在集合F中删除作为左、右子树的两棵二叉树,并将新建立的二叉树加入到集合F中;

(4)重复

(2)(3)两步,直到F中只剩下一棵二叉树时,这棵二叉树就是赫夫曼树。

例如:

假定用于通讯的电文仅有8个字母C1,C2,⋯,C8组成,各个字母在电文中出现的

频率分别为5,25,3,6,10,11,36,4,试画出赫夫曼树并进行对这

8个字母设计赫夫

曼编码。

1

虽然赫夫曼树的带权路径长度是唯一的,但形态不唯一。

0

本题中各字母编码如下:

c1:

0110c2:

10c3:

0010

0

1

0

1

c4:

0111c5:

000c6:

010

c7:

11

c8:

0011

1

25

36

c7

6:

邻接矩阵

1

0

1

0

c2

所谓邻接矩阵(AdjacencyMatrix)的存储结构,

c510

11

1

就是用一维数组存储图中顶点的信息,

0

1

c6

0

c4

用矩阵表示图中各顶点之间的邻接关系。

c33

4

5

6

假设图G=(V,E)有n个确定的顶点,

c8

c1

即V={v0,v1,⋯,vn-1},则表示G中各顶点相邻关系为一个

n×n的矩阵,矩阵的元素为:

1

若(vi,vj)或是E(G)中的边

A[i][j]=

{0

若(vi,vj)或不是E(G)中的边

若G是网图,则邻接矩阵可定义为:

wij

若(vi,vj)或是E(G)中的边

A[i][j]=

{0或∞若(vi,vj)或不是E(G)中的边

其中,wij表示边(vi,vj)或上的权值;∞表示一个计算机允许的、大于所有边上权值的数。

例:

V0

V3

0

1

0

1

3

1

0

1

1

A=

V1

V2

0

1

0

0

1

1

0

0

一个无向图的邻接矩阵表示

0

6

∞9

6

3

9

3

2

9

∞4

5

1

6

4

∞7

4

A=

5

7

35

∞∞8

8

∞∞7

8

4

3

 

一个网图的邻接矩阵表示

 

7:

邻接表

给出上图无向图对应的邻接表表示。

vertexfirstedge

0

V0

1

3

1

V1

0

2

3∧

2

V2

1

1

3

V3

0

1

图的邻接表表示

例如有向图

V1

V2

 

V3V4

 

邻接表和逆邻接表为:

 

0

V1

2

1

0

3

V1

1

V2

1

V2

0

2

V3

3

2

V3

0

3

V4

0

23

V4

(a)邻接表

(b)逆邻接表

8:

已知有向图或无向图,给出深度优先遍历序列或广度优先遍历序列(生成树)

 

V1

 

V2V3

 

V4V5V6V7

 

V8

 

遍历序列要知道两点:

初始点和存储结构,特别采用邻接表的存储结构表结点的顺序不

同,得到的遍历序列可能不同。

深度优先搜索可从图中某个顶点发v出发,访问此顶点,然

后依次从v的未被访问的邻接点出发深度优先遍历图,直至图中所有和v有路径相通的顶点

都被访问到;若此时图中尚有顶点未被访问,则另选图中一个未曾被访问的顶点作起始点,

重复上述过程,直至图中所有顶点都被访问到为止。

以上图为例,进行图的深度优先搜索。

假设从顶点v1出发进行搜索,邻接点的顺序由

小到大排列。

在访问了顶点v1之后,找到第一个邻接点v2。

因为v2未曾访问,则从v2出

发进行搜索。

依次类推,接着从v4、v8、v5出发进行搜索。

在访问了v5之后,由于v5

 

的邻接点都已被访问,则搜索回到v8。

由于同样的理由,搜索继续回到v4,v2直至v1,

此时由于v1的另一个邻接点未被访问,则搜索又从v1到v3,再继续进行下去由此,得到

的顶点访问序列为:

v1→v2→v4→v8→v5→v3→v6→v7

若进行广度优先搜索遍历,首先访问v1和v1的邻接点v2和v3,然后依次访问v2的

邻接点v4和v5及v3的邻接点v6和v7,最后访问v4的邻接点v8。

由于这些顶点的邻接

点均已被访问,并且图中所有顶点都被访问,

由些完成了图的遍历。

得到的顶点访问序列为:

v1→v2→v3→v4→v5→v6→v7→v8

由深度优先搜索得到的为深度优先生成树;由广度优先搜索得到的为广度优先生成树。

V1

V1

V2

V3

V2

V3

V4

V6

V4

V5

V6

V7

V8

V7

V8

V5

广度优先生成树

深度优先生成树

9:

最小生成树

Prim算法的思想:

从所有

u∈U,v∈V-U的边中,选取具有最小权值的边(

u,v),将顶

点v加入集合U中,将边(u,v)加入集合T中,如此不断重复,直到

U=V时,最小生

成树构造完毕,这时集合

T中包含了最小生成树的所有边。

Prim算法可用下述过程描述,其中用

wuv表示顶点u与顶点v边上的权值。

(1)U={u1},T={};

(2)while(U≠V)do

(u,v)=min{wuv;u∈U,v∈V-U}

T=T+{(u,v)}

U=U+{v}

(3)结束。

图8.23(a)所示的一个网图,按照Prim方法,从顶点1出发,该网的最小生成树的产生过程如图(b)、(c)、(d)、(e)、(f)和(g)所示。

V1

60

V3

V3

V3

50

52

42

45

50

65

V4

V2

V4

V7

V4

V7

V2

V7

50

30

40

70

V6

V6

V5

V5

V5

V6

(a)

(b)

(c)

V3

V3

V3

50

50

50

V4

V7

V7

V7

40

50

50

40

V6

40

30

V6

(d)(e)(f)

 

V3

V1

V3

50

50

45

42

42

V2

50

V4

V7

V2

50

V4

V7

40

V5

30

V6

40

V5

30

V6

 

(g)(h)

Prim算法构造最小生成树的过程示意

按照Kruskal方法构造最小生成树:

按照网中边的权值由小到大的顺序,不断选取当前

未被选取的边集中权值最小的边。

依据生成树的概念,n个结点的生成树,有n-1条边,

故反复上述过程,直到选取了n-1条边为止,就构成了一棵最小生成树。

 

V1

V3

V3

V3

42

V2

V4

V7

V2

V4

V7

V4

V7

V5

30

V6

40

30

V6

40

30

V6

V5

V5

(a)

(b)

(c)

V3

V3

50

V3

45

50

45

45

42

42

42

V4

V7

V7

V7

40

40

50

30

30

V6

40

30

V6

(d)

(e)

(f)

Kruskal

算法构造最小生成树的过程示意

10:

拓扑排序

对AOV网进行拓扑排序的方法和步骤是:

①从AOV网中选择一个没有前驱的顶点(该顶点的入度为

0)并且输出它;

②从网中删去该顶点,并且删去从该顶点发出的全部有向边;

③重复上述两步,直到剩余的网中不再存在没有前驱的顶点为止。

例:

求所有拓扑序列

V3

v1

v3

v2

v4

v5

v6

V1

V6

v3

v4

v5

v6

V4

v2

V2

V5

v4

v3

v5v6

v2

v1

v3

v4

v5

v6

AOV网

v4

v3

v5

v6

11:

关键路径

(1)事件的最早发生时间ve[k]

ve[k]是指从源点到顶点的最大路径长度代表的时间。

这个时间决定了所有从顶点发出

的有向边所代表的活动能够开工的最早时间。

根据

AOE网的性质,只有进入

vk的所有活

 

都结束时,vk代表的事件才能发生;而活动的最早结束时间为ve[j]+dut(<

vj,vk>)

所以计算

vk

发生的最早时间的方法如下:

ve[k]=0vk是源点

ve[k]=Max{ve[j]+dut()}

其中,p[k]表示所有到达vk的有向边的集合;

∈p[k]

dut()为有向边

否则

上的权值。

(2)事件的最迟发生时间vl[k]

vl[k]是指在不推迟整个工期的前提下,事件vk允许的最晚发生时间。

设有向边

vj>代表从vk出发的活动,为了不拖延整个工期,vk发生的最迟时间必须保证不推迟从事件

vk出发的所有活动的终点vj的最迟时间vl[j]。

vl[k]的计算方法如下:

vl[k]=ve[n]vk是汇点

vl[k]=Min{vl[j]-dut()}

∈s[k]

否则

其中,s[k]为所有从vk发出的有向边的集合。

(3)活动ai的最早开始时间e[i]

若活动ai是由弧表示,根据AOE网的性质,只有事件vk发生了,活动

开始。

也就是说,活动ai的最早开始时间应等于事件vk的最早发生时间。

因此,有:

 

ai才能

e[i]=ve[k]

(4)活动ai的最晚开始时间l[i]

活动ai的最晚开始时间指,在不推迟整个工程完成日期的前提下,必须开始的最晚时

间。

若由弧>表示,则ai的最晚开始时间要保证事件vj的最迟发生时间不拖后。

此,应该有:

l[i]=vl[j]-dut(

根据每个活动的最早开始时间e[i]和最晚开始时间l[i]就可判定该活动是否为关键活动,

也就是那些l[i]=e[i]的活动就是关键活动,而那些l[i]>e[i]的活动则不是关键活动,l[i]-e[i]

的值为活动的时间余量。

关键活动确定之后,关键活动所在的路径就是关键路径。

 

a3=2

V4

a7=6

V2

V7

a1=3

a4=1

a8=8

a11=7

V1

V5

V11

a2=4

a5=3

a9=4

V3

a6=5

V8

a12=4

a15=6

V6

a13=10

V10

a10=2

V9

a14=1

图8.37

一个AOE网实例

首先,按照

(8-1)式求事件的最早发生时间

ve[k]。

ve

(1)=0

ve

(2)=3

ve(3)=4

ve(4)=ve

(2)+2=5

ve(5)=max{ve

(2)+1,ve(3)+3}=7

ve(6)=ve(3)+5=9

 

ve(7)=max{ve(4)+6,ve(5)+8}=15

ve(8)=ve(5)+4=11

ve(9)=max{ve(8)+10,ve(6)+2}=21

ve(10)=max{ve(8)+4,ve(9)+1}=22

ve(11)=max{ve(7)+7,ve(10)+6}=28

其次,按照

(8-2)式求事件的最迟发生时间vl[k]。

vl(11)=ve(11)=28

vl(10)=vl(11)-6=22

vl(9)=vl(10)-1=21

vl(8)=min{vl(10)-4,vl(9)-10}=11

vl(7)=vl(11)-7=21

vl(6)=vl(9)-2=19

vl(5)=min{vl(7)-8,vl(8)-4}=7

vl(4)=vl(7)-6=15

vl(3)=min{vl(5)-3,vl(6)-5}=4

vl

(2)=min{vl(4)-2,vl(5)-1}=6

vl

(1)=min{vl

(2)-3,vl(3)-4}=0

再按照(8-3)式和(8-4)式求活动ai的最早开始时间

e[i]和最晚开始时间l[i]。

活动a1

e

(1)=ve

(1)=0

l

(1)=vl

(2)-3=3

活动a2

e

(2)=ve

(1)=0

l

(2)=vl(3)-4=0

活动a3

e(3)=ve

(2)=3

l(3)=vl(4)-2=13

活动a4

e(4)=ve

(2)=3

l(4)=vl(5)-1=6

活动a5

e(5)=ve(3)=4

l(5)=vl(5)-3=4

活动a6

e(6)=ve(3)=4

l(6)=vl(6)-5=14

活动a7

e(7)=ve(4)=5

l(7)=vl(7)-6=15

活动a8

e(8)=ve(5)=7

l(8)=vl(7)-8=13

活动a9

e(9)=ve(5)=7

l(9)=vl(8)-4=7

活动a10

e(10)=ve(6)=9

l(10)=vl(9)-2=19

活动a11

e(11)=ve(7)=15

l(11)=vl(11)-7=21

活动a12

e(12)=ve(8)=11

l(12)=vl(10)-4=18

活动a13

e(13)=ve(8)=11

l(13)=vl(9)-10=11

活动a14

e(14)=ve(9)=21

l(14)=vl(10)-1=21

活动a15

e(15)=ve(10)=22

l(15)=vl(11)-6=22

最后,比较e[i]和l[i]

的值可判断出

a2,a5,a9,a13,a14,a15是关键活动,关键路径如下图所

示。

V1

V5

V11

a9=4

a2=4

V8

a5=3

a15=6

V3

a13=4

V10

V9

a14=1

 

12:

最短路径

例如,下图所示一个有向网图邻接矩阵为:

∞∞10∞30100

100

V5

60

V0

V4

10

30

20

10

V1

V3

5

V2

50

 

∞5

∞50

∞10

∞20

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 人文社科 > 法律资料

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1