解析在后面,有问题的话欢迎各位大佬指正:
答案解析:
提示:不会做就画图,原理虽然不理解但答案基本都能出来
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分)
- 79
- 551
- 1063
- 不确定
作者: 何钦铭
单位: 浙江大学
2-2
若森林F有15条边、25个结点,则F包含树的个数是:(2分)
- 8
- 9
- 10
- 11
作者: DS课程组
单位: 浙江大学
2-3
将森林转换为对应的二叉树,若在二叉树中,结点u是结点v的父结点的父结点,则在原来的森林中,u和v可能具有的关系是: (3分)
- 父子关系; 2. 兄弟关系; 3. u的父结点与v的父结点是兄弟关系
- 只有2
- 1和2
- 1和3
- 1、2和3
作者: DS课程组
单位: 浙江大学
2-4
对于一个有N个结点、K条边的森林,共有几棵树? (2分)
- N−K
- N−K+1
- N−K−1
- 不能确定
作者: DS课程组
单位: 浙江大学
2-5
设森林F中有三棵树,第一、第二、第三棵树的结点个数分别为M1,M2和M3。则与森林F对应的二叉树根结点的右子树上的结点个数是: (2分)
- M1
- M1+M2
- M2+M3
- M3
作者: DS课程组
单位: 浙江大学
2-6
由若干个二叉树组成的森林F中,叶结点总个数为N,度为2的结点总个数为M,则该集合中二叉树的个数为: (3分)
- M−N
- N−M
- N−M−1
- 无法确定
作者: DS课程组
单位: 浙江大学
2-7
已知一棵完全二叉树的第6层(设根为第1层)有8个叶结点,则该完全二叉树的结点个数最多是: (3分)
- 39
- 52
- 111
- 119
作者: DS课程组
单位: 浙江大学
2-8
在一个用数组表示的完全二叉树中,如果根结点下标为1,那么下标为17和19这两个结点的最近公共祖先结点在哪里(数组下标)? (注:两个结点的“公共祖先结点”是指同时都是这两个结点祖先的结点) (3分)
- 8
- 4
- 2
- 1
作者: DS课程组
单位: 浙江大学
2-9
具有65个结点的完全二叉树其深度为(根的深度为1): (3分)
- 8
- 7
- 6
- 5
作者: DS课程组
单位: 浙江大学
保存
判断题
单选题
程序填空题
编程题
5-1
下列代码的功能是计算给定二叉树T
的宽度。二叉树的宽度是指各层结点数的最大值。函数Queue_rear
和Queue_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 */
}