DS_Tree

1-1

对于一个有N个结点、K条边的森林,不能确定它共有几棵树。

F

[解析]设边的数目 EdgeNum, 树的数目为 TreeNum
根据 NodeNum - 1 = EdgeNum
所以 (NodeNum1 - 1) + … + (NodeNumi - 1) = K
即 N - TreeNum = K


1-2

树是表示多对多关系的数据结构。

F


1-3

从树的根结点到任何一个叶结点都有唯一的一条线性表。

T


 

1-4

一棵树中位于同一层上的结点称为兄弟结点。

F


1-5

一棵树中,某结点位置上方各层中的所有结点都是该结点的祖先。

F


2-1

分数 5

作者 DS课程组

单位 浙江大学

树最适合于用来表示

A.有序数据元素

B.无序数据元素

C.元素之间无联系的数据

D.元素之间具有分支层次关系的数据


2-2

若将一棵树 T 转化为对应的二叉树 BT,则下列对 BT 的遍历中,其遍历序列与 T 的后根遍历序列相同的是:

A.先序遍历

B.中序遍历

C.后序遍历

D.按层遍历

解析:后根遍历树可分为两步:①从左到右访问双亲结点的每个孩子(转化为二叉树后就是先访问根结点再访问右子树);②访问完所有孩子后再访问它们的双亲结点(转化为二叉树后就是先访问左子树再访问根结点),因此树T的后根遍历序列与其相应二叉树BT的中序遍历序列相同。对于此类题,采用特殊值法求解通常会更便捷,左下图树T转换为二叉树BT的过程如下图所示,树T的后序遍历序列显然和其相应二叉树BT的中序遍历序列相同,均为5,6,7,2,3,4, 1。因此选B.

e754ad200d2247eaaee6f6f18502d9e0.png#pic_center


2-3

分数 5

作者 王俊玲

单位 集美大学

一棵度为4的树T中,若有20个度为4的结点,10个度为3的结点,1个度为2的结点,10个度为1的结点,则树T的叶子结点个数是( )。

A.41

B.82

C.113

D.122

度为4的树:

度:某个节点的子节点个数
叶结点:度为0的结点
度为4的树,说明该树中结点的子结点最多为4个
树中结点总个数=(所有的结点的度数)+1
∵ 在树中,除了根节点没有前驱结点,其他节点有且只有一个前驱节点(树的定义)
又∵ 父结点的‘度’是子结点的个数,而每个子结点前驱结点都是该父结点
∴ 因此,所有结点的“度”加起来,就是把所有结点子结点的个数加起来,又因为,根结点没有父节点,所以所以没有把根结点算计进来,于是:树中结点总个数=(所有的结点的度数)+1(根节点)
推广→ 一个森林的所有结点数=(所有结点的度数+n(n棵树,每棵树只有一个根节点)
1.sum(所有结点个数)=20x4+10x3+1x2+10x1+1(根结点)=123个结点
2.sum(叶子节点个数)=123-20-10-1-10=82

推广→ 一个森林的所有叶子结点数=(所有结点的度数+n(n棵树,每棵树只有一个根节点)-m(度数非0的结点个数)


2-4

分数 5

作者 考研真题

单位 浙江大学

若三叉树 T 中有 244 个结点(叶结点的高度为 1 ), 则 T 的高度至少是

A.8

B.7

C.6

D.5

每一层节点数是上一层的3倍 第一层为1
故第n层有3^(n-1)
完全满三叉树有1+3+9+....+3^(n-1) 等比数列
等比数列前n项和为: (3^n-1)/2;
带入244 得 3^n=489
因为 3^5 =243 、3^6 =729
而243 < 489 < 729
即3^5 < 3^n <3^6
所以高度为6


2-5

分数 5

作者 陈越

单位 浙江大学

一棵有47个结点的树一定有______条边。

A.47

B.46

C.92

D.23

n棵树时,边数 = 结点数-n


2-6

分数 5

作者 DS课程组

单位 浙江大学

将森林转换为对应的二叉树,若在二叉树中,结点u是结点v的父结点的父结点,则在原来的森林中,u和v可能具有的关系是:

  1. 父子关系; 2. 兄弟关系; 3. u的父结点与v的父结点是兄弟关系

A.只有2

B.1和2

C.1和3

D.1、2和3

森林与二叉树的转换规则为:“左孩子右兄弟”。
在最后生成的二叉树中,父子关系在对应森林关系中可能是兄弟关系或原本就是父子关系。
Situation 1:结点v是结点u的第二个孩子结点(父子关系),转换后,结点v就变成结点u第一个孩子的右孩子。
Situation 2:结点u和v是兄弟但二者之间还有一个兄弟节点,转换后,结点v变成结点k的右孩子,结点k变成结点u的右孩子。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAX0FsZXhfMDA3,size_10,color_FFFFFF,t_70,g_se,x_16

 

对于③,结点v的父结点是原先的父结点或兄弟结点。若结点u的父结点与v的父结点是兄弟关系,则转换后不可能出现结点u时结点v的父结点的父结点。


2-7

分数 5

作者 DS课程组

单位 浙江大学

若森林F有15条边、25个结点,则F包含树的个数是:

A.8

B.9

C.10

D.11


2-8

分数 5

作者 考研真题

单位 浙江大学

某森林 F 对应的二叉树为 T,若 T 的先序遍历序列是 a, b, d, c, e, g, f,中序遍历序列是 b, d, a, e, g, c, f,则 F 中的树的棵树是:

A.1

B.2

C.3

D.4

首先先构造二叉树:

66713173f9f0472aacf6af8f35091e8f.png

 

根据孩子兄弟表示法转换成对应的森林:

d44aec6c8750419abbad42176f7d393a.png

 

则可以得到有3棵树,选C

1、树转换为二叉树

  由于二叉树是有序的,为了避免混淆,对于无序树,我们约定树中的每个结点的孩子结点按从左到右的顺序进行编号。

  将树转换成二叉树的步骤是:
  (1)加线,图例红色。就是在所有兄弟结点之间(同一层同一双亲结点的结点间)加一条连线;
  (2)抹线。就是对树中的每个结点,只保留他与第一个孩子结点之间的连线,删除它与其它孩子结点之间的连线;
  (3)旋转。就是以树的根结点为轴心,将整棵树顺时针旋转一定角度,使之结构层次分明,红色横线连起来的结点作为最左结点的右孩子

a01700fe46754ae4b8cdeca6f3485749.png

 

2、森林转换为二叉树

  森林是由若干棵树组成,可以将森林中的每棵树的根结点看作是兄弟,由于每棵树都可以转换为二叉树,所以森林也可以转换为二叉树。

  将森林转换为二叉树的步骤是:
  (1)先把每棵树转换为二叉树;
  (2)第一棵二叉树不动,从第二棵二叉树开始,依次把后一棵二叉树的根结点作为前一棵二叉树的根结点的右孩子结点,用线连接起来。当所有的二叉树连接起来后得到的二叉树就是由森林转换得到的二叉树。

29c1a1e2227743a2873f0cf9c6845468.png

22a740d072784f9ba55df9dcfd27054a.gif

 

 b58643f303ec46c7ab4f435dea2c89da.png

3、二叉树转换为树、森林

  二叉树转换为树是树转换为二叉树的逆过程,其步骤是:
  (1)若某结点的左孩子结点存在,将左孩子结点的右孩子结点、右孩子结点的右孩子结点……都作为该结点的孩子结点,将该结点与这些右孩子结点用线连接起来;
  (2)删除原二叉树中所有结点与其右孩子结点的连线;
  (3)整理(1)和(2)两步得到的树,使之结构层次分明。

2a0dce78c0414fe6a1367c8b4ee67439.gif

bfe93c38b3674327a69d7fa3e5dcfbd3.png

 

二叉树转换为森林比较简单,其步骤如下:

  (1)先把每个结点与右孩子结点的连线删除,得到分离的二叉树;
  (2)把分离后的每棵二叉树转换为树;
  (3)整理第(2)步得到的树,使之规范,这样得到森林。

  判断一棵二叉树能够转换成一棵树还是森林,标准很简单,那就是只要看这棵二叉树的根结点有没有右孩子,有的话就是森林,没有的话就是一棵树。

dea17a7b052f4c43a28159e971c4a3e5.png

 结论:

  根据树与二叉树的转换关系以及二叉树的遍历定义可以推知:(树只有先根遍历和后根遍历,没有中序,因为定义子树未必是两个,可能是三个,没法左右,所以分支大于2的树,也就是有两个以上的孩子,这种树是没有中序遍历)

  1. 树的先序遍历与其转换的相应的二叉树的先序遍历的结果序列相同;
  2. 树的后序遍历与其转换的二叉树的中序遍历的结果序列相同;
  3. 树的层序遍历与其转换的二叉树的后序遍历的结果序列相同。

  由森林与二叉树的转换关系以及森林与二叉树的遍历定义可知:(森林只有先序遍历和中序遍历,注意森林中序遍历,同二叉树的不一样,没有后序,有的教材虽然叫后序,实质还是先访问子森林然后根,在除此之后下一森林)

  1. 森林的先序遍历和中序遍历与所转换得到的二叉树的先序遍历和中序遍历的结果序列相同。

  解决下森林没有后序遍历:注意在森林的遍历中,把结点下面的一群孩子结点全看成左孩子结点了。

  在这样的上下文环境下,结点就无右孩子了,只有先序->根左,或者中序->左根,而后序->左根,所以就没有后序了,这也是为什么有些教材也叫后序遍历,如果是叫后序遍历,等价于对应二叉树的中序,也就是不管森林里叫它中序也好,后续也好,都等价于对应二叉树的中序遍历。 

2e2e999ab1d5df80b067207d1039d976.png

森林的遍历有两种方法:

(1)先序遍历森林

    1. 访问森林中第一棵树的根结点;
    2. 先序遍历森林中第一棵树的根结点子树组成的森林;
    3. 先序遍历除去第一棵树之外其余的树组成的森林。

(2)中序遍历森林

    1. 中序遍历森林中第一棵树的根结点的子树组成的森林;(这里相当于把结点下面的孩子结点全看成左孩子结点了)
    2. 访问第一棵树的根结点;
    3. 中序遍历除去第一棵树之外其余的树组成的森林。

假设:推测(3)后序遍历森林

  1.         后序遍历森林中第一棵树的根结点的子树组成的森林;
    1. 后序遍历除去第一棵树之外其余的树组成的森林;
    2. 访问第一棵树的根结点。

      按此得出的序列 B C D F J H I G E A

    和对应二叉树的后序序列 D C B F J H I G E A 不一样。也没有什么研究意义了。另,在对应二叉树中B C D有顺序层次,而在森林中BCD,全看成左孩子,它们遍历的结果便不一样了。

5a4ccb9b423b0f04a6ebba376ef10d36.png


2-9

设森林F中有三棵树,第一、第二、第三棵树的结点个数分别为9、8、7。与森林F对应的二叉树根结点的右子树上的结点个数是( )

A.16

B.15

C.7

D.17
根据森林转换为二叉树的法则,二叉树的根结点通常是第一棵树的结点,二叉树的左子树是由第一棵树删去根后所得所有子树构成的,二叉树的右子树是由其它树(第二,第三棵树)构成的,故左子树结点个数是M1-1,右子树上的结点个数是M2+M3。


2-10

如果一棵非空k(k≥2)叉树T中每个非叶子结点都有k个孩子,则称T为正则k叉树。若T的高度为h(单结点的树h=1),则T的结点数最少为:

A.(kh−1−1)/(k−1)+1

B.(kh−1)/(k−1)−1

C.kh

D.k(h−1)+1

最多结点为满k叉树

利用等比数列求和得到   eq?%5Csum_%7BJ%3D1%7D%5E%7Bh%7D%20k%5E%7Bj-1%7D%3D%5Cfrac%7Bk%5E%7Bh%7D-1%7D%7Bk-1%7D

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5LqM5oiY5Zu956eR5aSn,size_19,color_FFFFFF,t_70,g_se,x_16

 第一层只有根结点,接下来2到最后都有k个结点,固最少为1+(h-1)*k 


2-11

如果一棵非空k(k≥2)叉树T中每个非叶子结点都有k个孩子,则称T为正则k叉树。若T有m个非叶子结点,则T中的叶子结点个数为:

A.mk

B.m(k−1)

C.m(k−1)+1

D.m(k−1)−1

(1)全部节点个数 = 叶子节点个数 + 非叶子节点个数

(2)树边数 = 全部节点个数 - 1

(3)树枝个数 = 全部节点的度数之和

n=n0+nk = n0+m 

又因为每个非叶结点都有k个孩子,所以树的边数=mk

n-1=mk

两式联立得n0=mk-m+1


2-12

如果一棵非空k(k≥2)叉树T中每个非叶子结点都有k个孩子,则称T为正则k叉树。若T的高度为h(单结点的树h=1),则T的结点数最多为:

A.(kh−1)/(k−1)

B.(kh−1−1)/(k−1)

C.(kh+1−1)/(k−1)

D.以上都不是


7-1 目录树

在ZIP归档文件中,保留着所有压缩文件和目录的相对路径和名称。当使用WinZIP等GUI软件打开ZIP归档文件时,可以从这些信息中重建目录的树状结构。请编写程序实现目录的树状结构的重建工作。

输入格式:

输入首先给出正整数N(≤104),表示ZIP归档文件中的文件和目录的数量。随后N行,每行有如下格式的文件或目录的相对路径和名称(每行不超过260个字符):

  • 路径和名称中的字符仅包括英文字母(区分大小写);
  • 符号“\”仅作为路径分隔符出现;
  • 目录以符号“\”结束;
  • 不存在重复的输入项目;
  • 整个输入大小不超过2MB。

输出格式:

假设所有的路径都相对于root目录。从root目录开始,在输出时每个目录首先输出自己的名字,然后以字典序输出所有子目录,然后以字典序输出所有文件。注意,在输出时,应根据目录的相对关系使用空格进行缩进,每级目录或文件比上一级多缩进2个空格。

输入样例:

7
b
c\
ab\cd
a\bc
ab\d
a\d\a
a\d\z\

输出样例:

root
  a
    d
      z
      a
    bc
  ab
    cd
    d
  c
  b

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

102101222_张凯权

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值