数据结构第7章树

合集下载

王道数据结构 第七章 查找思维导图-高清脑图模板

王道数据结构 第七章 查找思维导图-高清脑图模板

每次调整的对象都是“最小不平衡子树”
插入操作
在插入操作,只要将最小不平衡子树调整平衡,则其他祖先结点都会恢复平衡
在A的左孩子的左子树中插入导致不平衡
由于在结点A的左孩子(L)的左子树(L)上插入了新结点,A的平衡因子由1增
至2,导致以A为根的子树失去平衡,需要一次向右的旋转操作。
LL
将A的左孩子B向右上旋转代替A成为根节点 将A结点向右下旋转成为B的右子树的根结点
RR平衡旋转(左单旋转)
而B的原左子树则作为A结点的右子树
在A的左孩子的右子树中插入导致不平衡
由于在结点A的左孩子(L)的右子树(R)上插入了新结点,A的平衡因子由1增
LR
至2,导致以A为根的子树失去平衡,需要两次旋转操作,先左旋转再右旋转。
将A的左孩子B的右子树的根结点C向左上旋转提升至B结点的位置
本质:永远保证 子树0<关键字1<子树1<关键字2<子树2<...
当左兄弟很宽裕时,用当前结点的前驱、前驱的前驱来填补空缺 当右兄弟很宽裕时,用当前结点的后继、后继的后继来填补空缺
兄弟够借。若被删除关键字所在结点删除前的关键字个数低于下限,且与此结点 右(或左)兄弟结点的关键字还很宽裕,则需要调整该结点、右(或左)兄弟结 点及其双亲结点及其双亲结点(父子换位法)
LL平衡旋转(右单旋转)
而B的原右子树则作为A结点的左子树
在A的右孩子的右子树中插入导致不平衡
由于在结点A的右孩子(R)的右子树(R)上插入了新结点,A的平衡因子由-1
减至-2,导致以A为根的子树失去平衡,需要一次向左的旋转操作。
RR
将A的右孩子B向左上旋转代替A成为根节点 将A结点向左下旋转成为B的左子树的根结点

第7章树和二叉树(2)-数据结构教程(Java语言描述)-李春葆-清华大学出版社

第7章树和二叉树(2)-数据结构教程(Java语言描述)-李春葆-清华大学出版社
1. 二叉树的定义
二叉树也称为二分树,它是有限的结点集合,这个集合或者是空,或者由 一个根结点和两棵互不相交的称为左子树和右子树的二叉树组成。 二叉树中许多概念与树中的概念相同。 在含n个结点的二叉树中,所有结点的度小于等于2,通常用n0表示叶子结 点个数,n1表示单分支结点个数,n2表示双分支结与度为2的树是不同的。
度为2的树至少有3个结点,而二叉树的结点数可以为0。 度为2的树不区分子树的次序,而二叉树中的每个结点最多有 两个孩子结点,且必须要区分左右子树,即使在结点只有一棵 子树的情况下也要明确指出该子树是左子树还是右子树。
2/35
归纳起来,二叉树的5种形态:
Ø
4/35
3. 满二叉树和完全二叉树
在一棵二叉树中,如果所有分支结点都有左孩子结点和右孩子结点,并且 叶子结点都集中在二叉树的最下一层,这样的二叉树称为满二叉树。
可以对满二叉树的结点进行层序编号,约定编号从树根为1开始,按照层 数从小到大、同一层从左到右的次序进行。
满二叉树也可以从结点个数和树高度之间的关系来定义,即一棵高度为h 且有2h-1个结点的二叉树称为满二叉树。
R={r} r={<ai,aj> | ai,aj∈D, 1≤i,j≤n,当n=0时,称为空二叉树;否则其中
有一个根结点,其他结点构成根结点的互不相交的左、右子树,该 左、右两棵子树也是二叉树 } 基本运算: void CreateBTree(string str):根据二叉树的括号表示串建立其存储结构。 String toString():返回由二叉树树转换的括号表示串。 BTNode FindNode(x):在二叉树中查找值为x的结点。 int Height():求二叉树的高度。 … }
5
E

数据结构第七章 树和森林

数据结构第七章 树和森林

7.5 树的应用
➢判定树
在实际应用中,树可用于判定问题的描述和解决。
•设有八枚硬币,分别表示为a,b,c,d,e,f,g,h,其中有一枚且 仅有一枚硬币是伪造的,假硬币的重量与真硬币的重量不同,可能轻, 也可能重。现要求以天平为工具,用最少的比较次数挑选出假硬币, 并同时确定这枚硬币的重量比其它真硬币是轻还是重。
的第i棵子树。 ⑺Delete(t,x,i)在树t中删除结点x的第i棵子树。 ⑻Tranverse(t)是树的遍历操作,即按某种方式访问树t中的每个
结点,且使每个结点只被访问一次。
7.2.2 树的存储结构
顺序存储结构 链式存储结构 不管哪一种存储方式,都要求不但能存储结点本身的数据 信息,还要能够唯一的反映树中各结点之间的逻辑关系。 1.双亲表示法 2.孩子表示法 3.双亲孩子表示法 4.孩子兄弟表示法
21
将二叉树还原为树示意图
A BCD
EF
A
B
C
E
D
F
A
B
C
E
D
F
22
练习:将下图所示二叉树转化为树
1 2
4
5
3
6
2 4
1 53
6
23
7.3.2 森林转换为二叉树
由森林的概念可知,森林是若干棵树的集合,只要将森林中各棵树 的根视为兄弟,森林同样可以用二叉树表示。 森林转换为二叉树的方法如下:
⑴将森林中的每棵树转换成相应的二叉树。 ⑵第一棵二叉树不动,从第二棵二叉树开始,依次把后一棵二叉树 的根结点作为前一棵二叉树根结点的右孩子,当所有二叉树连起来 后,此时所得到的二叉树就是由森林转换得到的二叉树。
相交的集合T1,T2,…,Tm,其中每一个集合Ti(1≤i≤m)本身又是 一棵树。树T1,T2,…,Tm称为这个根结点的子树。 • 可以看出,在树的定义中用了递归概念,即用树来定义树。因此, 树结构的算法类同于二叉树结构的算法,也可以使用递归方法。

数据结构习题及答案与实验指导(树和森林)7

数据结构习题及答案与实验指导(树和森林)7

第7章树和森林树形结构是一类重要的非线性结构。

树形结构的特点是结点之间具有层次关系。

本章介绍树的定义、存储结构、树的遍历方法、树和森林与二叉树之间的转换以及树的应用等内容。

重点提示:●树的存储结构●树的遍历●树和森林与二叉树之间的转换7-1 重点难点指导7-1-1 相关术语1.树的定义:树是n(n>=0)个结点的有限集T,T为空时称为空树,否则它满足如下两个条件:①有且仅有一个特定的称为根的结点;②其余的结点可分为m(m>=0)个互不相交的子集T1,T2,…,T m,其中每个子集本身又是一棵树,并称为根的子树。

要点:树是一种递归的数据结构。

2.结点的度:一个结点拥有的子树数称为该结点的度。

3.树的度:一棵树的度指该树中结点的最大度数。

如图7-1所示的树为3度树。

4.分支结点:度大于0的结点为分支结点或非终端结点。

如结点a、b、c、d。

5.叶子结点:度为0的结点为叶子结点或终端结点。

如e、f、g、h、i。

6.结点的层数:树是一种层次结构,根结点为第一层,根结点的孩子结点为第二层,…依次类推,可得到每一结点的层次。

7.兄弟结点:具有同一父亲的结点为兄弟结点。

如b、c、d;e、f;h、i。

8.树的深度:树中结点的最大层数称为树的深度或高度。

9.有序树:若将树中每个结点的子树看成从左到右有次序的(即不能互换),则称该树为有序树,否则称为无序树。

10.森林:是m棵互不相交的树的集合。

7-1-2 树的存储结构1.双亲链表表示法以图7-1所示的树为例。

(1)存储思想:因为树中每个元素的双亲是惟一的,因此对每个元素,将其值和一个指向双亲的指针parent构成一个元素的结点,再将这些结点存储在向量中。

(2)存储示意图:-1 data:parent:(3)注意: Parrent域存储其双亲结点的存储下标,而不是存放结点值。

下面的存储是不正确的:-1 data:parent:2.孩子链表表示法(1)存储思想:将每个数据元素的孩子拉成一个链表,链表的头指针与该元素的值存储为一个结点,树中各结点顺序存储起来,一般根结点的存储号为0。

数据结构教程李春葆课后答案第7章树和二叉树

数据结构教程李春葆课后答案第7章树和二叉树
第 7 章 树和二叉树
教材中练习题及参考答案
1. 有一棵树的括号表示为 A(B,C(E,F(G)),D),回答下面的问题: (1)指出树的根结点。 (2)指出棵树的所有叶子结点。 (3)结点 C 的度是多少? (4)这棵树的度为多少? (5)这棵树的高度是多少? (6)结点 C 的孩子结点是哪些? (7)结点 C 的双亲结点是谁? 答:该树对应的树形表示如图 7.2 所示。 (1)这棵树的根结点是 A。 (2)这棵树的叶子结点是 B、E、G、D。 (3)结点 C 的度是 2。 (4)这棵树的度为 3。 (5)这棵树的高度是 4。 (6)结点 C 的孩子结点是 E、F。 (7)结点 C 的双亲结点是 A。
12. 假设二叉树中每个结点值为单个字符,采用二叉链存储结构存储。设计一个算法 计算一棵给定二叉树 b 中的所有单分支结点个数。 解:计算一棵二叉树的所有单分支结点个数的递归模型 f(b)如下:
f(b)=0 若 b=NULL
6 f(b)=f(b->lchild)+f(b->rchild)+1 f(b)=f(b->lchild)+f(b->rchild)
表7.1 二叉树bt的一种存储结构 1 lchild data rchild 0 j 0 2 0 h 0 3 2 f 0 4 3 d 9 5 7 b 4 6 5 a 0 7 8 c 0 8 0 e 0 9 10 g 0 10 1 i 0
答:(1)二叉树bt的树形表示如图7.3所示。
a b c e h j f i d g e h j c f i b d g a
对应的算法如下:
void FindMinNode(BTNode *b,char &min) { if (b->data<min) min=b->data; FindMinNode(b->lchild,min); //在左子树中找最小结点值 FindMinNode(b->rchild,min); //在右子树中找最小结点值 } void MinNode(BTNode *b) //输出最小结点值 { if (b!=NULL) { char min=b->data; FindMinNode(b,min); printf("Min=%c\n",min); } }

数据结构第七章课后习题答案 (1)

数据结构第七章课后习题答案 (1)

7_1对于图题7.1(P235)的无向图,给出:(1)表示该图的邻接矩阵。

(2)表示该图的邻接表。

(3)图中每个顶点的度。

解:(1)邻接矩阵:0111000100110010010101110111010100100110010001110(2)邻接表:1:2----3----4----NULL;2: 1----4----5----NULL;3: 1----4----6----NULL;4: 1----2----3----5----6----7----NULL;5: 2----4----7----NULL;6: 3----4----7----NULL;7: 4----5----6----NULL;(3)图中每个顶点的度分别为:3,3,3,6,3,3,3。

7_2对于图题7.1的无向图,给出:(1)从顶点1出发,按深度优先搜索法遍历图时所得到的顶点序(2)从顶点1出发,按广度优先法搜索法遍历图时所得到的顶点序列。

(1)DFS法:存储结构:本题采用邻接表作为图的存储结构,邻接表中的各个链表的结点形式由类型L_NODE规定,而各个链表的头指针存放在数组head中。

数组e中的元素e[0],e[1],…..,e[m-1]给出图中的m条边,e中结点形式由类型E_NODE规定。

visit[i]数组用来表示顶点i是否被访问过。

遍历前置visit各元素为0,若顶点i被访问过,则置visit[i]为1.算法分析:首先访问出发顶点v.接着,选择一个与v相邻接且未被访问过的的顶点w访问之,再从w 开始进行深度优先搜索。

每当到达一个其所有相邻接的顶点都被访问过的顶点,就从最后访问的顶点开始,依次退回到尚有邻接顶点未曾访问过的顶点u,并从u开始进行深度优先搜索。

这个过程进行到所有顶点都被访问过,或从任何一个已访问过的顶点出发,再也无法到达未曾访问过的顶点,则搜索过程就结束。

另一方面,先建立一个相应的具有n个顶点,m条边的无向图的邻接表。

数据结构(C语言版)_第7章 图及其应用

数据结构(C语言版)_第7章 图及其应用
(1)创建有向图邻接表 (2)创建无向图的邻接表
实现代码详见教材P208
7.4 图的遍历
图的遍历是对具有图状结构的数据线性化的过程。从图中任 一顶点出发,访问输出图中各个顶点,并且使每个顶点仅被访 问一次,这样得到顶点的一个线性序列,这一过程叫做图的遍 历。
图的遍历是个很重要的算法,图的连通性和拓扑排序等算法 都是以图的遍历算法为基础的。
V1
V1
V2
V3
V2
V3
V4
V4
V5
图9.1(a)

图7-2 图的逻辑结构示意图
7.2.2 图的相关术语
1.有向图与无向图 2.完全图 (1)有向完全图 (2)无向完全图 3.顶点的度 4.路径、路径长度、回路、简单路径 5.子图 6.连通、连通图、连通分量 7.边的权和网 8.生成树
2. while(U≠V) { (u,v)=min(wuv;u∈U,v∈V-U); U=U+{v}; T=T+{(u,v)}; }
3.结束
7.5.1 普里姆(prim)算法
【例7-10】采用Prim方法从顶点v1出发构造图7-11中网所对 应的最小生成树。
构造过程如图7-12所示。
16
V1
V1
V2
7.4.2 广度优先遍历
【例7-9】对于图7-10所示的有向图G4,写出从顶点A出发 进行广度优先遍历的过程。
访问过程如下:首先访问起始顶点A,再访问与A相邻的未被 访问过的顶点E、F,再依次访问与E、F相邻未被访问过的顶 点D、C,最后访问与D相邻的未被访问过的顶点B。由此得到 的搜索序列AEFDCB。此时所有顶点均已访问过, 遍历过程结束。
【例7-1】有向图G1的逻辑结构为:G1=(V1,E1) V1={v1,v2,v3,v4},E1={<v1,v2>,<v2,v3>,<v2,v4>,<v3,v4>,<v4,v1>,<v4,v3>}

数据结构(朱战立)章 (7)

数据结构(朱战立)章 (7)
2
7.1 树
7.1.1 树的定义 树是由n(n≥0)个结点构成的集合。 n=0的树称为空树;
对n>0的树T有: (1) 有一个特殊的结点称为根结点, 根结点没有前驱结点;
3
(2) 当n>1时, 除根结点外其他结点被分成m(m>0)个互不相 交的集合T1, T2,…, Tm, 其中每一个集合Ti(1≤i≤m)本身又 是一棵结构和树类同的子树。
10
7.1.2 树的表示方法 树的表示方法主要有三种, 分别用于不同的用途。 1. 直观表示法 图7 - 1就是一棵以直观表示法表示的树。 树的直观表示法
主要用于直观描述树的逻辑结构。 2. 形式化表示法 树的形式化表示法主要用于树的理论描述。 树的形式化表
示法定义树T为T=(D,R),其中D为树T中结点的集合, R为树T 中结点之间关系的集合。 当树T为空树时D=∅; 当树T不为空树 时有
5ቤተ መጻሕፍቲ ባይዱ
下面介绍树的其他一些常用术语。 结点: 由数据元素和构造数据元素之间关系的指针组成。 例如, 在图7 - 1(a)中有1个结点, 图7 - 1(b)中有12个结点。 结点的度: 结点所拥有的子树的个数称为该结点的度。 例 如, 在图7 - 1(b)中结点A的度为3, 结点B的度为2, 结点J的 度为0。 叶结点: 度为0的结点称为叶结点, 叶结点也称作终端结 点。 例如, 在图7 - 1(b)中结点J,F,K,L,H,I均为叶结点。
6
分支结点: 度不为0的结点称为分支结点, 分支结点也称 作非终端结点。 显然, 一棵树中除叶结点外的所有结点都是分 支结点。
孩子结点: 树中一个结点的子树的根结点称作这个结点的 孩子结点。 例如, 在图7 - 1(b) 中结点B,C,D是结点A的孩 子结点。 孩子结点也称作后继结点。

数据结构第三版第七章作业参考答案

数据结构第三版第七章作业参考答案

//栈指针置初值
do { while (t)
//将 t 的所有左结点进栈
{ top++;
St[top]=t;
t=t->lchild;
} p=NULL; flag=1; while (top!=-1 && flag)
//p 指e当前结点的前一个已fg



//h置 t 的fgij为已fg过
{ t=St[top]; if (t->rchild==p) { if (t==s)
7.1 设二叉树 bt 的一种存储结构如下:
1 2 3 4 5 6 7 8 9 10 lchild 0 0 2 3 7 5 8 0 10 1 data j h f d b a c e g i rchild 0 0 0 9 4 0 0 0 0 0
其中,bt 为树根结点指针,lchild、rchild 分别为结点的左、右孩子指针域,
Ctree(t->lchild,A,2*i);
//递归构造*t 的左子树
Ctree(t->rchild,A,2*i+1); //递归构造*t 的右子树
}
}
7.5 设计一个算法,将一棵以二叉链方式存储的二叉树 t 按顺序方式存储到数组 A 中。
解:由二叉树的顺序存储方式可知本题的递归模型f()如下:
f(t,A,i):A[i]=' ';
//顺序队首尾指针 //cm=1 表示二叉树为完全二叉树 //bj=1 表示到目前为止所有结点均有左右孩子
if (b!=NULL)
{ rear++;
Qu[rear]=b;
while (first!=rear) { first++;

数据结构作业第七章树

数据结构作业第七章树

数据结构作业第7 章1.假设每个结点值为单个字符,而一棵树的层次遍历序列为ABCDEFGHIJ,则其根结点的值是。

A.A B. B C. J D. 以上都不对2.在一颗3 次树中度为3 的结点数为两个,度为2 的结点数为一个,度为1 的结点数为两个,则度为0 的结点数为个。

A.4 B. 5 C. 6 D. 73 . 对于一棵具有n 个结点、度为4 的树来说,。

A.树的高度最多是n-3B. 树的高度最多是n-3C. 第i 层上最多有4(i-1)个结点D. 至少在某一层上正好有4 个结点4.在任何一棵二叉树中,如果结点a 有左孩子b、右孩子c、则在结点的先序序列、中序序列、后序序列中,。

A.结点b 一定在结点a 前面B. 结点a 一定在结点c 前面C. 结点b 一定在结点c 前面D. 结点a 一定在结点b 前面5.设a、b 为一颗二叉树上的两个结点,在中序序列时,a 在b 之前的条件是。

A.a 在b 的右方 B. a 是b 的祖先C. a 在b 的左方D. a 是b 的子孙6.若二叉树的中序序列是abcdef,且c 为根结点,则。

A.结点c 有两个孩子B. 二叉树有两个度为0 的结点C. 二叉树的高度为5D. 以上都不对7.设有13 个值,用他们组成一颗哈夫曼树,则该哈夫曼树共有个结点。

A.13 B. 12 C.26 D. 258.在n 个结点的线索二叉树中(不计头结点),线索的数目为。

A.n-1B. nC. n+1D. 2n9.一棵度为2 的树中,其结点个数最少为。

10.设某棵树中结点值为单个字符,其后根遍历序列为ABCDEFG,则根结点值为。

11.一共8 层的完全二叉树至少有个结点,具有100 个结点的完全二叉树中结点的最大层数为。

12.设一棵完全二叉树(每个结点值为单个字符)的先序序列为abdecf,则该二叉树的中序序列为、层次序列为。

13.一棵二叉树的先序、中序和后序序列分别如下,其中有一部分未显示出来。

数据结构第7章-答案

数据结构第7章-答案

一、单选题C01、在一个图中,所有顶点的度数之和等于图的边数的倍。

A)1/2 B)1 C)2 D)4B02、在一个有向图中,所有顶点的入度之和等于所有顶点的出度之和的倍。

A)1/2 B)1 C)2 D)4B03、有8个结点的无向图最多有条边。

A)14 B)28 C)56 D)112C04、有8个结点的无向连通图最少有条边。

A)5 B)6 C)7 D)8C05、有8个结点的有向完全图有条边。

A)14 B)28 C)56 D)112B06、用邻接表表示图进行广度优先遍历时,通常是采用来实现算法的。

A)栈 B)队列 C)树 D)图A07、用邻接表表示图进行深度优先遍历时,通常是采用来实现算法的。

A)栈 B)队列 C)树 D)图A08、一个含n个顶点和e条弧的有向图以邻接矩阵表示法为存储结构,则计算该有向图中某个顶点出度的时间复杂度为。

A)O(n) B)O(e) C)O(n+e) D)O(n2)C09、已知图的邻接矩阵,根据算法思想,则从顶点0出发按深度优先遍历的结点序列是。

A)0 2 4 3 1 5 6 B)0 1 3 6 5 4 2 C)0 1 3 4 2 5 6 D)0 3 6 1 5 4 2B10、已知图的邻接矩阵同上题,根据算法,则从顶点0出发,按广度优先遍历的结点序列是。

A)0 2 4 3 6 5 1 B)0 1 2 3 4 6 5 C)0 4 2 3 1 5 6 D)0 1 3 4 2 5 6D11、已知图的邻接表如下所示,根据算法,则从顶点0出发按深度优先遍历的结点序列是。

A)0 1 3 2 B)0 2 3 1 C)0 3 2 1 D)0 1 2 3A12、已知图的邻接表如下所示,根据算法,则从顶点0出发按广度优先遍历的结点序列是。

A)0 3 2 1 B)0 1 2 3 C)0 1 3 2 D)0 3 1 2A13、图的深度优先遍历类似于二叉树的。

A)先序遍历 B)中序遍历 C)后序遍历 D)层次遍历D14、图的广度优先遍历类似于二叉树的。

数据结构:第7章 图3-最小生成树

数据结构:第7章 图3-最小生成树

• 按照生成树的定义,n 个顶点的连通网络的生成树有 n
个顶点、n-1 条边。
即有权图
目标:
在网络的多个生成树中,寻找一个各边权值之和最小的
生成树。
构造最小生成树的准则 ❖ 必须只使用该网络中的边来构造最小生成树;
❖ 必须使用且仅使用n-1条边来联结网络中的n个顶点;
❖ 不能使用产生回路的边。
典型用途:
(b) u={1} w={2,3,4,5,6}
0 6 1 5
6
0
5
3
1 5 0 7 5 4
5
7
0
2
3 5 0 6
4 2 6 0
i
1234
closest[i] 1 1 1 1
lowcost[i] 0 6 1 5
56 11 ∞∞
closest用于存放顶点序号 lowest存放权值
15 4 6
1 25
3
54
5
6
(c ) u={1,3} w={2,4,5,6}
1
1
4
25
6
32
54
5
6
(d) u={1,3,6} w={2,4,5}
i
1234 5 6
closest[i] 1 3 1 1 3 3
lowcost[i] 0 5 0 5 5 4
i
1234 5 6
closest[i] 1 3 1 6 3 3

v3 v1

树 v4 v2
v1
0^ 1^ 0^ 1^
2.生成森林
若一个图是非连通图或非强连通图,但有若 干个连通分量或若干个强连通分量,则通过 深度优先搜索遍历或广度优先搜索遍历,不 可以得到生成树,但可以得到生成森林,且 若非连通图有 n 个顶点,m 个连通分量或强 连通分量,则可以遍历得到m棵生成树,合 起来为生成森林,森林中包含n-m条树边。

数据结构课后习题第七章

数据结构课后习题第七章

一、选择题1.设树T的度为4,其中度为1,2,3和4的结点个数分别为4,2,1,1,则T中的叶结点的个数为()。

A.5B.6C.7D.82. 设森林F中有三棵树,第一、第二、第三棵树的结点个数分别为M1,M2和M3。

与森林F对应的二叉树根结点的右子树上的结点个数为()。

A.M1B.M1+M2C.M3D.M2+M33.将一棵树T转换为孩子—兄弟链表表示的二叉树H,则T的后跟序遍历是H的()。

A.前序遍历B.中序遍历C.后序遍历4. 设F是一个森林,B是由F变换得的二叉树。

若F中有n个非终端顶点,则B中右指针域为空的结点有()。

A.n-1B.nC.n+1D.n+25.如果2T是由有序树T转换而来的二叉树,那么T中结点的后序遍历序列就是T的()遍历序列。

2A.先序B.中序C.后序D.层次序6. 在一颗度为4的树T 中,若有20个度为4的结点,10个度为3的结点,1个度为2的结点,10个度为1的结点,则树T中叶结点的个数是()。

A.41B.42C.82D.122二、判断题1.树形结构中元素之间存在一对多个的关系.()。

2.将一棵树转成二叉树,根结点没有左子树()。

3.树与二叉树是两种不同的树形结构。

()4.对树定义中序遍历和对森林定义后序遍历都无意义()。

5.由树的先序遍历序列和后序遍历序列可以唯一确定该树()。

三、填空题1.树在计算机内的表示方式有(),(),()。

2.已知一棵树度为3的树有2个度为1的结点,3个度为2的结点,4个度为3的结点,则该树有()个叶子结点。

3.每一棵树都能唯一的转换为它所对应的二叉树。

若已知一颗二叉树的前序遍历序列是BEFCGDH,中序遍历序列是FEBGCHD,则它的后序遍历序列是()。

设上述二叉树是由某棵树转换而成,则该树的先序遍历序列是()。

4. 先序遍历森林正好等同于按()遍历对应的二叉树,后序遍历森林正好等同于按()遍历对应的二叉树。

5.利用树的孩子兄弟表示法存储,可以将一棵树转换为()。

第7章树和二叉树(4)-数据结构教程(Java语言描述)-李春葆-清华大学出版社

第7章树和二叉树(4)-数据结构教程(Java语言描述)-李春葆-清华大学出版社

if (p.node.rchild!=null)
//有右孩子时将其进队
qu.offer(new QNode(p.lno+1,p.node.rchild));
}
}
return cnt;
}
7/31
解法2
层次遍历中某层的最右结点last
last
A
B
C
D
EF
G
last的作用确定一层是否遍历完成!
8/31
用cnt变量计第k层结点个数(初始为0)。设计队列仅保存结点引用, 置当前层次curl=1,用last变量指示当前层次的最右结点(根结点)进队。 将根结点进队,队不空循环:
int curl=1;
//当前层次,从1开始
BTNode<Character> last;
//当前层中最右结点
last=bt.b;
//第1层最右结点
qu.offer(bt.b);
//根结点进队
while (!qu.isEmpty())
{ if (curl>k) return cnt; p=qu.poll(); if (curl==k) cnt++; if (p.lchild!=null) { q=p.lchild; qu.offer(q); } if (p.rchild!=null) { q=p.rchild; qu.offer(q); } if (p==last) { last=q; curl++; }
}
Queue<QNode> qu=new LinkedList<QNode>(); //定义一个队列qu
QNode p;
qu.offer(new QNode(1,bt.b)); //根结点(层次为1)进队

数据结构第7章 图习题

数据结构第7章 图习题

习题7 图7.1 单项选择题1.在一个图中,所有顶点的度数之和等于所有边数的____倍。

A. 1/2B. 1C. 2D. 42.任何一个无向连通图的最小生成树。

A.只有一棵B.有一棵或多棵C.一定有多棵D.可能不存在3.在一个有向图中,所有顶点的入度之和等于所有顶点的出度之和的____倍。

A. 1/2B. 1C. 2D. 44.一个有n个顶点的无向图最多有____条边。

A. nB. n(n-1)C. n(n-1)/2D. 2n5.具有4个顶点的无向完全图有____条边。

A. 6B. 12C. 16D. 206.具有6个顶点的无向图至少应有____条边才能确保是一个连通图。

A. 5B. 6C. 7D. 87.在一个具有n个顶点的无向图中,要连通全部顶点至少需要____条边。

A. nB. n+1C. n-1D. n/28.对于一个具有n个顶点的无向图,若采用邻接矩阵表示,则该矩阵的大小是____。

A. nB. (n-1)2C. n-1D. n29.对于一个具有n个顶点和e条边的无向图,若采用邻接表表示,则表头向量的大小为_①___;所有邻接表中的接点总数是_②___。

①A. n B. n+1 C. n-1 D. n+e②A. e/2 B. e C.2e D. n+e10.已知一个图如图7.1所示,若从顶点a出发按深度搜索法进行遍历,则可能得到的一种顶点序列为__①__;按宽度搜索法进行遍历,则可能得到的一种顶点序列为__②__。

①A. a,b,e,c,d,f B. e,c,f,e,b,d C. a,e,b,c,f,d D. a,e,d,f,c,b②A. a,b,c,e,d,f B. a,b,c,e,f,d C. a,e,b,c,f,d D. a,c,f,d,e,b图 7.1 一个无向图11.已知一有向图的邻接表存储结构如图7.2所示。

图7.2 一个有向图的邻接表存储结构⑴根据有向图的深度优先遍历算法,从顶点v1出发,所得到的顶点序列是____。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
}
}
int count(Node *root)
{
int l,r;
if(root==NULL)
return 0;
else
{
if((root-&gt;leftchild==NULL)&amp;&amp;(root-&gt;rightchild==NULL))
return 1;
else
count(root-&gt;leftchild);
count(root-&gt;rightchild);
}
return t;
}
5.统计利用先序遍历创建的二叉树中的空链域个数
#include&lt;malloc.h&gt;
#include&lt;iostream&gt;
using namespace std;
{
char ch;
cin&gt;&gt;ch;
if(ch!=&#39;#&#39;)
{
root=(Node *)malloc(sizeof(Node));
root-&gt;data=ch;
root-&gt;leftchild=NULL;
root-&gt;rightchild=NULL;
{
int t=1,l,r;
if(root==NULL||(root-&gt;leftchild!=NULL&amp;&amp;root-&gt;rightchild!=NULL)||(root-&gt;leftchild==NULL&amp;&amp;root-&gt;rightchild==NULL))
typedef struct node
{
char data;
node *leftchild,*rightc
hild;
}Node;
void precreat(Node *&amp;root)
{
l=count(root-&gt;leftchild);
r=count(root-&gt;rightchild);
return l+r;
}
}
}
int main()
{
Node *L;
int m;
precreat(L);
m=count(L);
cout&lt;&lt;m;
root=(Node *)malloc(sizeof(Node));
root-&gt;data=ch;
root-&gt;leftchild=NULL;
root-&gt;rightchild=NULL;
precreat(root-&gt;leftchild);
precreat(root-&gt;rightchild);
{
Node *L;
precreat(L);
inorder(L);
return 1;
}
7.输出利用先序遍历创建的二叉树的后序遍历序列
void postorder(Node *root)
{
if(root!=NULL)
{
postorder(root-&gt;leftchild);
n=count2(L);
sum=nodeTotal(L);
cout&lt;&lt;m*2+(sum-m-n);
return 1;
}
6.输出利用先序遍历创建的二叉树的中序遍历序列
#include&lt;malloc.h&gt;
#include&lt;iostream&gt;
using namespace std;
{
l=count1(root-&gt;leftchild);
r=count1(root-&gt;rightchild);
return l+r;
}
}
}
int count2(Node *root)
{
int l,r;
if(root==NULL)
return 0;
else
{
if((root-&gt;leftchild!=NULL)&amp;&amp;(root-&gt;rightchild!=NULL))
return l+r;
}
}
}
int main()
{
Node *L;
int m;
precreat(L);
m=count(L);
cout&lt;&lt;m;
return 1;
}
4.统计利用先序遍历创建的二叉树的度为1的结点个数
int count(Node *root)
}
}
}
}
9.统计先序遍历创建的二叉树的宽度
int BTreeWidth(Node *b)
root=(Node *)malloc(sizeof(Node));
root-&gt;data=ch;
root-&gt;leftchild=NULL;
root-&gt;rightchild=NULL;
precreat(root-&gt;leftchild);
precreat(root-&gt;rightchild);
precreat(root-&gt;leftchild);
precreat(root-&gt;rightchild);
}
}
int nodeTotal(Node *root)
{
if(root==NULL)return 0;
else
{
return 1+nodeTotal(root-&gt;leftchild)+nodeTotal(root-&gt;rightchild);
typedef struct node
{
char data;
node *leftchild,*rightchild;
}Node;
void precreat(Node *&amp;root)
{
char ch;
cin&gt;&gt;ch;
if(ch!=&#39;#&#39;)
{
root-&gt;data=ch;
root-&gt;leftchild=NULL;
root-&gt;rightchild=NULL;
precreat(root-&gt;leftchild);
precreat(root-&gt;rightchild);
}
}
int heigh(Node *root)
root-&gt;rightchild=NULL;
precreat(root-&gt;leftchild);
precreat(root-&gt;rightchild);
}
}
int count(Node *root)
{
int l,r;
if(root==NULL)
return 0;
1.统计利用先序遍历创建的二叉树的深度
#include&lt;malloc.h&gt;
#include&lt;iostream&gt;
using namespace std;
typedef struct node
front=rear=-1;
if(root!=NULL)
{
rear=(rear+1)%500;
queue[rear]=root;
while(rear!=front)
{
front=(front+1)%500;
p=queue[front];
cout&lt;&lt;p-&gt;data;
{
int l,r;
if(root==NULL)
return 0;
else
{
l=heigh(root-&gt;leftchild);
r=heigh(root-&gt;rightchild);
return((l&gt;r)?(l+1):(r+1));
}
}
int main()
{
Node *L;
int n;
precreat(L);
n=heigh(L);
cout&lt;&lt;n;
return 1;
}
2.统计利用先序遍历创建的二叉树叶结点的个数
#include&lt;malloc.h&gt;
#include&lt;iostream&gt;
using namespace std;
{
char data;
node *leftchild,*rightchild;
相关文档
最新文档