第六章树和二叉树--树和森林-计算机17级(期末复习带详细版)

解析在后面,有问题的话欢迎各位大佬指正:

 

答案解析:

提示:不会做就画图,原理虽然不理解但答案基本都能出来

p1-1:

x2-1:

x2-2:同b1-1

x2-3:这个其实你只要会了森林转换成二叉树的方法画个图自己看看就成

比如最下面这个图,你看看bd和ac的过程就会发现只有父子和兄弟两种关系

无法成为u的父亲与v的父亲是兄弟的尴尬关系。hhhh

x2-4:同p1-1

x2-5:方法可以看x2-3里图片里的方法

x2-6:要注意怎么表示二叉树的边数

x2-7:其实就是考二叉树的两个性质

x2-8:

没啥可说的,实在不会画图吧。。。

x2-9:

ct:算法大致和层序遍历没啥区别

temp_width++

if ( p->Right != NULL ) Enqueue(p->Right, Q);

temp_width = 0

 

 

 

 

 

 

 

 

1-1

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

T         F

2-1

具有1102个结点的完全二叉树一定有__个叶子结点。(3分)

  1. 79
  2. 551
  3. 1063
  4. 不确定

作者: 何钦铭

单位: 浙江大学

2-2

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

  1. 8
  2. 9
  3. 10
  4. 11

作者: DS课程组

单位: 浙江大学

2-3

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

  1. 父子关系; 2. 兄弟关系; 3. u的父结点与v的父结点是兄弟关系
  1. 只有2
  2. 1和2
  3. 1和3
  4. 1、2和3

作者: DS课程组

单位: 浙江大学

2-4

对于一个有N个结点、K条边的森林,共有几棵树? (2分)

  1. N−K
  2. N−K+1
  3. N−K−1
  4. 不能确定

作者: DS课程组

单位: 浙江大学

2-5

设森林F中有三棵树,第一、第二、第三棵树的结点个数分别为M​1​​,M​2​​和M​3​​。则与森林F对应的二叉树根结点的右子树上的结点个数是: (2分)

  1. M​1​​
  2. M​1​​+M​2​​
  3. M​2​​+M​3​​
  4. M​3​​

作者: DS课程组

单位: 浙江大学

2-6

由若干个二叉树组成的森林F中,叶结点总个数为N,度为2的结点总个数为M,则该集合中二叉树的个数为: (3分)

  1. M−N
  2. N−M
  3. N−M−1
  4. 无法确定

作者: DS课程组

单位: 浙江大学

2-7

已知一棵完全二叉树的第6层(设根为第1层)有8个叶结点,则该完全二叉树的结点个数最多是: (3分)

  1. 39
  2. 52
  3. 111
  4. 119

作者: DS课程组

单位: 浙江大学

2-8

在一个用数组表示的完全二叉树中,如果根结点下标为1,那么下标为17和19这两个结点的最近公共祖先结点在哪里(数组下标)? (注:两个结点的“公共祖先结点”是指同时都是这两个结点祖先的结点) (3分)

  1. 8
  2. 4
  3. 2
  4. 1

作者: DS课程组

单位: 浙江大学

2-9

具有65个结点的完全二叉树其深度为(根的深度为1): (3分)

  1. 8
  2. 7
  3. 6
  4. 5

作者: DS课程组

单位: 浙江大学

保存

判断题

1

单选题

123456789

程序填空题

1

编程题

5-1

下列代码的功能是计算给定二叉树T的宽度。二叉树的宽度是指各层结点数的最大值。函数Queue_rearQueue_front分别返回当前队列Q中队尾和队首元素的位置。

typedef struct TreeNode *BinTree;
struct TreeNode
{
   int Key;
   BinTree  Left;
   BinTree  Right;
};

int Width( BinTree T )
{
   BinTree  p;
   Queue Q;
   int Last, temp_width, max_width;

   temp_width = max_width = 0;
   Q = CreateQueue(MaxElements);
   Last = Queue_rear(Q);
   if ( T == NULL) return 0;
   else {
      Enqueue(T, Q);
      while (!IsEmpty(Q)) {
         p = Front_Dequeue(Q); 
         (3分); 
         if ( p->Left != NULL )  Enqueue(p->Left, Q);
         (3分);  
         if ( Queue_front(Q) > Last ) {
            Last = Queue_rear(Q);
            if ( temp_width > max_width ) max_width = temp_width;
            (3分);
         } /* end-if */
      } /* end-while */
      return  max_width;
   } /* end-else */
} 

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值