GESP 客观题评测系统

试卷解析 · 理解每一步

提高组 CSP-S 2026 初赛模拟卷 9

CSPS-2026-R1-Mock-9

试卷解析总览,可直接查看每题答案与解析。

一、单项选择题

第 1 题(单选题,2 分)

设根节点的深度为 0,若 k > 1,则一棵深度为 h 的满 k 叉树共有( )个节点。

A.
(kh+1−1)/k(k^{h+1} - 1)/k
B.
(kh−1)/(k−1)(k^h - 1)/(k - 1)
C.
(kh+1−1)/(k−1)(k^{h+1} - 1)/(k - 1)
D.
(kh−1)/k(k^h - 1)/k

正确答案C

解析详情
答案 C计算机基础与数据结构算法
思路与推导
  1. 第 i 层 kik^{i} 个, ∑i=0hki=(kh+1−1)/(k−1)\sum_{i=0}^{h} k^{i} = (k^{h+1} - 1)/(k-1)。

第 2 题(单选题,2 分)

微型计算机中,控制器的基本功能是()。

原卷另有选项 E:存放程序和数据。

A.
控制机器各个部件协调工作
B.
实现算术运算和逻辑运算
C.
存储各种控制信息
D.
获取外部信息

正确答案A

解析详情
答案 A计算机基础与数据结构算法
思路与推导
  1. 常识。选项 B 是运算器的功能,选项 D 是输入设备的功能,选项 E 是存储器的功能。选项 A、B、D、E 加输出设备是计算机的五个基础组件。

第 3 题(单选题,2 分)

设栈 S 和队列 Q 的初始状态为空,元素 e1,⋯ ,e6e_{1}, \cdots, e_{6} 依次通过栈 S,一个元素出栈后即进入队列 Q,若出队的顺序为 e2,e4,e3,e6,e5,e1e_{2}, e_{4}, e_{3}, e_{6}, e_{5}, e_{1},则栈 S 的容量至少应该为()。

A.
1
B.
3
C.
4
D.
6

正确答案B

解析详情
答案 B计算机基础与数据结构算法
思路与推导
  1. 队列不改变元素的出入顺序,所以出栈顺序就是 e2,e4,e3,e6,e5,e1e_{2}, e_{4}, e_{3}, e_{6}, e_{5}, e_{1}。在入栈顺序为从小到大时,栈的最小容量就是出栈序列的最长下降子序列(LDS)长度,这里是 3(如 e6,e5,e1e_{6}, e_{5}, e_{1})。这是因为任何下降子序列必然同时出现在栈中,而任何时刻栈中的元素一定也是出栈序列中的下降子序列。

第 4 题(单选题,2 分)

完全二叉树共有 2019 个节点,则它的叶节点数是()。

A.
1019
B.
1009
C.
1000
D.
1010

正确答案D

解析详情
答案 D计算机基础与数据结构算法
思路与推导
  1. 完全二叉树至多只有 1 个一度节点,而任何二叉树都满足 n2=n0+1n_{2}=n_{0}+1( nin_{i} 表示 i 度节点个数),加上 n0+n1+n2=2019n_{0}+n_{1}+n_{2}=2019, n1=0,1n_{1}=0,1,解出 n0=1010n_{0}=1010。

第 5 题(单选题,2 分)

将数组 {8,23,4,16,77,−5,53,100}\{8,23,4,16,77,-5,53,100\} 中的元素按从小到大的顺序排列,每次可以交换任意两个元素,最少需要交换( )次。

A.
5
B.
6
C.
7
D.
9

正确答案A

解析详情
答案 A计算机基础与数据结构算法
思路与推导
  1. 针对这个数据规模手动模拟 + 排除法即可,例如简单的选择排序(每次将最小的换到头部)正好只需要 5 次交换。一般性的做法是用最终排名替代每个数,即 35247168,其作为一个置换有 3 个循环节:(132576)(4)(8),每次交换至多且总可以增加 1 个,最后要变成 8 个,8 - 3 = 5。另外,选项 D 是只能交换相邻两个元素时的答案,也就是逆序对数,也等于冒泡排序的交换次数。

第 6 题(单选题,2 分)

设栈 S 的初始状态为空,元素 a, b, c, d, e, f 依次入栈 S,S 的最大容量为 3,则有( )种可能的出栈顺序。

A.
80
B.
85
C.
89
D.
90

正确答案C

解析详情
答案 C计算机基础与数据结构算法
思路与推导
  1. 最笨的方法是暴力枚举(也还好)。较好的方法是标数法(参见下页图),相当于从坐标 (0,0)(0,0) 沿右下方向走到 (6,6)(6,6),且全程位于直线 y = x 和 y = x - 3 之间的方案数。

第 7 题(单选题,2 分)

与十进制数 28.5625 相等的四进制数是()。

A.
131.20
B.
131.21
C.
130.20
D.
130.21

正确答案D

解析详情
答案 D计算机基础与数据结构算法
思路与推导
  1. 除了暴力转进制,讨巧的办法是:整数部分是偶数,故可排除选项 A 和 B;小数部分超过一半(十进制 0.5),也就是四进制的 0.2,故可排除选项 C。

第 8 题(单选题,2 分)

小写字母 'm' 的十六进制的 ASCII 码值是()。

A.
6A
B.
6B
C.
6C
D.
6D

正确答案D

解析详情
答案 D计算机基础与数据结构算法
思路与推导
  1. 需要记忆 'a' 的 ASCII 码(十进制)为 97,则 'm' 为 109 = 16 × 6 + 13。

第 9 题(单选题,2 分)

在有 N 个叶节点的哈夫曼树中,节点总数为()。

A.
2N-1
B.
2N
C.
2N+1
D.
2N+3

正确答案A

解析详情
答案 A计算机基础与数据结构算法
思路与推导
  1. 哈夫曼数没有1度节点,而2度节点比叶节点少一个。

第 10 题(单选题,2 分)

电线上停着两种鸟(A 和 B),可以看出相邻的两只鸟将电线划分为一个线段。这些线段可分为两类:一类是线段两端的鸟种类相同,另一类是线段两端的鸟种类不同。已知电线的两个端点处恰好停着种类相同的鸟,那么两端的鸟种类不同的线段数目一定是()。

A.
奇数
B.
偶数
C.
可奇可偶
D.
数目固定

正确答案B

解析详情
答案 B计算机基础与数据结构算法
思路与推导
  1. 从一端(假设为 A 种鸟)出发,每经过一个两端不同的线段,就由 A 变 B 或由 B 变 A,而最后变回 A,所以需要偶数次。

第 11 题(单选题,2 分)

下列关于图灵奖的说法中,错误的是()。

A.
图灵奖是美国计算机协会于 1966 年设立的,专门奖励那些为计算机事业做出重要贡献的个人
B.
图灵奖有“计算机界诺贝尔奖”之称
C.
迄今为止,还没有华裔计算机科学家获此殊荣
D.
图灵奖的名称取自计算机科学先驱、英国科学家阿兰·图灵

正确答案C

解析详情
答案 C计算机基础与数据结构算法
思路与推导
  1. 唯一获得图灵奖的华裔科学家是姚期智。

第 12 题(单选题,2 分)

若计算机在工作过程中突然断电,( )中的信息不会丢失。

A.
寄存器
B.
CPU
C.
ROM
D.
RAM

正确答案C

解析详情
答案 C计算机基础与数据结构算法
思路与推导
  1. 常识。ROM 是内存中的只读部分,信息永久保存。

第 13 题(单选题,2 分)

设 A=C=trueA = C = \text{true}, B=D=falseB = D = \text{false},逻辑运算表达式( )的值为真。

A.
(A∧B)∨((C∧D)∨A)(A \land B) \lor ((C \land D) \lor A)
B.
((A∧B)∨C)∧D((A \land B) \lor C) \land D
C.
(B∨(C∧D))∨(D∧A)(B \lor (C \land D)) \lor (D \land A)
D.
A∧(D∨C)∧BA \land (D \lor C) \land B

正确答案A

解析详情
答案 A计算机基础与数据结构算法
思路与推导
  1. 逐个代入验证即可。

第 14 题(单选题,2 分)

二叉树 T,已知其前序遍历序列是 1243576,后序遍历序列是 4275631,则该二叉树的中序遍历序列不可能是()。

A.
4217536
B.
2417536
C.
4217563
D.
2415736

正确答案C

解析详情
答案 C计算机基础与数据结构算法
思路与推导
  1. 因为前序/后序遍历序列 + 中序遍历序列可以确定树结构,所以逐个选项检查即可,画出树结构并验证。选项 C 中,利用前序 + 中序,确定根节点为 1,右子树的 3 个遍历序列是:前序 3576,中序 7563,后序 7563。后序和中序一样,说明右子树只能是一条左向的链,那么前序序列应该是 3657。

第 15 题(单选题,2 分)

2-3 树是一种特殊的树,它满足两个条件:(1) 每个非叶节点有两个或三个子节点;(2) 所有叶节点到根节点的路径长度相同。如果一棵 2-3 树有 10 个叶节点,那么它不可能有( )个非叶节点。

A.
6
B.
7
C.
8
D.
9

正确答案A(另接受:D)

解析详情
答案 A计算机基础与数据结构算法
思路与推导
  1. 类似于满二叉树,只是非叶节点分二叉和三叉,有 10 个叶节点,则倒数第 2 层要么是 5 个二叉节点,要么是 2 个二叉节点 +2 个三叉节点。不管是哪种情况,再往上都只能有 3 个节点了(5 = 2 + 3 或 4 = 2 + 2)。所以只有 2 种可行解:7 或 8。

二、阅读程序(1)

#include <bits/stdc++.h>
using namespace std;

int main() {
    string s;
    cin >> s; // 如无特殊说明,保证输入字符串只有小写字母,且长度小于 10
    for (int i, j;;) {
        for (i = 1; i < s.size(); i++)
            if (s[i] >= 'a' && s[i] <= 'z' && s[i] == s[i - 1]) break;
        if (i == s.size()) break;
        for (j = i; j < s.size(); j++)
            if (s[j] != s[j - 1]) break;
        string t = "";
        if (j < s.size()) t = s.substr(j);
        t += s[i] - 'a' + 'A';
        t += '0' + j - i + 1;
        t += s.substr(0, i - 1);
        s = t;
    }
    cout << s << endl;
    return 0;
}

第 16 题(判断题,1 分)

代码存在死循环风险。 ()

正确答案错误

解析详情
答案 错误字符串压缩模拟
思路与推导
  1. 每轮操作至少会减少两个小写字母,有限次操作后一定会出现第8行的 if 不再命中,于是就会触发 break。

第 17 题(判断题,2 分)

将第 7 行中的 i<s.size() 改成 i<=s.size()-1,程序运行正常且输出没有变化。()

正确答案正确

解析详情
答案 正确字符串压缩模拟
思路与推导
  1. s.size() 是无符号类整数,理论上,如果 s.size()=0,减一会造成错误结果。但这里是 cin 输入的,cin 不可能输入一个空串。

第 18 题(判断题,2 分)

记 s 的长度为 n,第 8 行中的 if 会被执行的总次数在最坏情况下是 O(n2)O(n^{2})。 ()

正确答案错误

解析详情
答案 错误字符串压缩模拟
思路与推导
  1. 最外层循环最坏情况下会进行 O(n)O(n) 轮(例如 s="aabbaabbaabb..."s = "aabbaabbaabb..."),看似确实是 O(n2)O(n^2),但注意每次 i 循环到第一段相同字符就 break 了。而后面的前后调换操作将 j 后面的部分挪到首部,相当于下一轮循环实际上接着上一轮的 j 继续枚举。所以实际上原字符串全程只被遍历了一次,这个 for 的复杂度是 O(n)O(n)。

第 19 题(单选题,3 分)

假如强行输入长度大于 10 的字符串,则以下说法中正确的是()。

A.
程序可能报错并异常退出
B.
程序仍可运行,但输出的内容可能不只有小写字母和数字
C.
程序可能出现死循环
D.
以上都不对

正确答案B

解析详情
答案 B字符串压缩模拟
思路与推导
  1. j-i+1>9 以后,就会出现 '0' ~ '9' 以外的其他字符(包括不可见字符),但不会出错。并且因为 t 的长度总是 2,每轮循环 s 的长度严格减小,所以不会出现死循环。

第 20 题(单选题,3 分)

输入 bxttttfu,输出为()。

A.
bxT4fu
B.
FUT4BX
C.
BXT4fu
D.
fuT4bx

正确答案D

解析详情
答案 D字符串压缩模拟
思路与推导
  1. 前面已说明过。

第 21 题(单选题,3 分)

输入 aabbccdd,输出为()。

A.
A2B2C2D2
B.
D2C2B2A2
C.
AABBCCDD
D.
a2b2c2d2

正确答案A

解析详情
答案 A字符串压缩模拟
思路与推导
  1. aabbccdd → bbccddA2 → cccddA2B2 → ddA2B2C2 → A2B2C2D2.

二、阅读程序(2)

#include <iostream>
using namespace std;

const int V = 100;
int n, m, ans, e[V][V];
bool visited[V];

void dfs(int x, int len) {
    visited[x] = true;
    if (len > ans) ans = len;
    for (int i = 1; i <= n; i++)
        if (!visited[i] && ~e[x][i])
            dfs(i, len + e[x][i]);
    visited[x] = false;
}

int main() { // 保证所有输入都是小于 100 的正整数
    cin >> n >> m;
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= n; j++) e[i][j] = -1;
    for (int i = 1, a, b, c; i <= m; i++) {
        cin >> a >> b >> c;
        e[a][b] = e[b][a] = c;
    }
    for (int i = 1; i <= n; i++) dfs(i, 0);
    cout << ans << endl;
    return 0;
}

第 22 题(判断题,1 分)

程序输出的一定是一个正整数。 ()

正确答案错误

解析详情
答案 错误图的最长简单路径
思路与推导
  1. 输入约束没有限制不存在自环(a=b),如果输入的图只包含自环,那么是不存在任何简单路径的,ans 将保持初始值 0。

第 23 题(判断题,2 分)

~e[x][i] 等价于 e[x][i] != -1。

正确答案正确

解析详情
答案 正确图的最长简单路径
思路与推导
  1. 语法常识。~ 表示二进制按位取反,包括符号位。~x 如果为 false,说明 x 的每一位都是 1,这表示 -1。

第 24 题(判断题,2 分)

输入允许 n 最大为 100,但实际上,在 1 秒的时限内无法运行完 n=100 规模的输入数据。()

正确答案正确

解析详情
答案 正确图的最长简单路径
思路与推导
  1. 此代码没有做任何搜索优化,所以枚举量随着 n 增大呈指数级增长,n=100 时不可能在 1 秒内运行完成。

第 25 题(判断题,2 分)

如果输入的图是连通的,那么当 ans 最后一次被赋值时,visited[1..n] 一定全都是 true. ()

正确答案错误

解析详情
答案 错误图的最长简单路径
思路与推导
  1. 连通不代表存在长 n 的简单路径,例如输入是一棵有分岔的无根树,这时候就不可能出现 visited 都为 true 的情况。

第 26 题(单选题,3 分)

该程序的时间复杂度为()。

A.
O(n+m)O(n + m)
B.
O(n2+m)O(n^{2} + m)
C.
O(2n+m)O(2^{n} + m)
D.
O(n!+m)O(n! + m)

正确答案D

解析详情
答案 D图的最长简单路径
思路与推导
  1. 因为是暴力枚举所有路径,理论上最坏情况(如完全图)相当于枚举 1..n 的全排列,所以是 n!。

第 27 题(单选题,3 分)

输入如下数据,输出为()。

46

1210

2320

3430

4140

1350

2460

A.
100
B.
150
C.
180
D.
210

正确答案C

解析详情
答案 C图的最长简单路径
思路与推导
  1. 2→4→1→32 \rightarrow 4 \rightarrow 1 \rightarrow 3。4个点图的简单路径至多有3条边,这已经是最长的3条且可行,所以就是最优解。

二、阅读程序(3)

#include <iostream>
using namespace std;

typedef unsigned int ui;

ui work(ui x) {
    ui s = x & (-x), r = s + x;
    return r | (((x ^ r) >> 2) / s);
}

int main() {
    ui n, k;
    cin >> n >> k; // 保证输入在 1..1000000 范围内
    for (int i = 1; i <= k; i++) n = work(n);
    cout << n << endl;
    return 0;
}

第 28 题(判断题,1 分)

将所有 ui 类型变量改为 int 类型,程序运行结果不变。 ()

正确答案错误

解析详情
答案 错误位运算与组合枚举
思路与推导
  1. 虽然输入在 1..1000000 范围内,但运算过程中会进位,特别是当 popcnt(n) 很小时,将很快进位,并有可能溢出到 int 的符号位。参见下面第 33 题的解析演示。

第 29 题(判断题,2 分)

假如强制输入 n=0,程序会发生死循环。 ()

正确答案错误

解析详情
答案 错误位运算与组合枚举
思路与推导
  1. 执行 work(0),则 s,r,x^~r 都为 0。由于除以 s,直接触发除数为 0,运行时异常,但不会出现死循环。

第 30 题(判断题,2 分)

假设不发生数值范围溢出的情况,那么主函数里的 n 只会单调变大。 ()

正确答案正确

解析详情
答案 正确位运算与组合枚举
思路与推导
  1. 在 work() 中, r = s + x > x,而结果又是 r 按位与一个数,也不可能变小。但注意,在一些特殊情况下,按题目的输入范围是可能出现溢出的,例如 n=1,k=100。

第 31 题(判断题,2 分)

r | ((x ^ r) >> 2) / s); 这个表达式有三组括号,它们都是必需的,即去掉任何一组都可能造成输出不同。

正确答案错误

解析详情
答案 错误位运算与组合枚举
思路与推导
  1. 这里涉及四次运算,其默认优先级为:除法 > 右移 > 按位异或 > 按位或。而要求的顺

  2. 序为:按位异或>右移>除法>按位或。所以最内层、中间层的括号必须保留以反转优先级;最外层的可以去掉,因为除法和按位或的相对优先级与默认的一致。当然,在实际编码中,对于这种复杂运算是推荐把括号都写全的。

第 32 题(单选题,3 分)

输入 1 100,输出为()。

A.
0
B.
某个数值确定但很大的数
C.
运行可能会报错
D.
不确定的某个随机数值

正确答案C

解析详情
答案 C位运算与组合枚举
思路与推导
  1. n=1 的效果是每次 work() 会乘 2(可以直接模拟证明),100 次 int 早就溢出了,unsigned int 溢出相当于模 2322^{32},所以 n 会变成 0,而这又会触发第 29 题中所述的除数为 0 的情况。

第 33 题(单选题,3 分)

输入 3 14,输出为()。

A.
45
B.
46
C.
48
D.
47

正确答案C

解析详情
答案 C位运算与组合枚举
思路与推导
  1. 从 00000011 执行 14 次,过程如下。

  2. $0000001100000011$$0000011000000110$$0000100100001001$$0000101000001010$$0001000100010001$$0001001000010010$$0001100000011000$$0010000100100001$$0010001000100010$$0011000000110000$

三、完善程序(1)

对于一个给定的两两不等的正整数序列,笛卡儿树是这样的一棵二叉树:首先它是一个最小堆,即除了根节点,每个节点的权值都大于其父节点的权值;其次,它的中序遍历序列恰好就是给定的序列。例如,对于序列7,2,12,1,10,5,15,3,下图就是一棵对应的笛卡儿树。现输入序列 a1,⋯ ,ana_{1},\cdots,a_{n}( 1≤n≤1001\leq n\leq100),试求其对应的笛卡儿树的深度d(设根节点的深度为1),以及有多少个叶节点的深度等于d。

#include <iostream>
using namespace std;

const int SIZE = 100 + 5;
const int INFINITY = 1000000;
int n, a[SIZE], maxDeep, num;

void solve(int left, int right, int deep) {
    int i, j;
    if (deep > maxDeep) {
        maxDeep = deep;
        num = 1;
    } else if (deep == maxDeep) {
        ①;
    }
    int min = INFINITY;
    for (int i = left; i <= right; i++)
        if (min > a[i]) {
            min = a[i];
            ②;
        }
    if (left < j) ③;
    if (j < right) ④;
}

int main() {
    cin >> n;
    for (int i = 1; i <= n; i++) cin >> a[i];
    ⑤;
    cout << maxDeep << ' ' << num << endl;
    return 0;
}

第 34 题(单选题,3 分)

① 处应填()。

笛卡儿树示意图
A.
num = 0
B.
num++
C.
num = INFINITY
D.
num--

正确答案B

解析详情
答案 B笛卡儿树
思路与推导
  1. 当前深度与目前得到的最深深度相同,则最深的个数加一。

第 35 题(单选题,3 分)

②处应填()。

A.
i = j
B.
j++
C.
j = min(i, j)
D.
j = i

正确答案D

解析详情
答案 D笛卡儿树
思路与推导
  1. 循环求 a[left]..a[right] 的最小值 min,下标为 a[j],找到更新的更新到 j。

第 36 题(单选题,3 分)

③处应填()。

A.
solve(left, j - 1, deep + 1)
B.
solve(left, j, deep + 1)
C.
solve(left, j, deep)
D.
solve(left, j - 1, deep)

正确答案A

解析详情
答案 A笛卡儿树
思路与推导
  1. 左子树为 left, j-1 这段,进入一棵子树深度加一。

第 37 题(单选题,3 分)

④处应填()。

A.
solve(j, right, deep + 1)
B.
solve(j + 1, right, deep)
C.
solve(j + 1, right, deep + 1)
D.
solve(j, right, deep)

正确答案A

解析详情
答案 A笛卡儿树
思路与推导
  1. 类似上题。

第 38 题(单选题,3 分)

⑤处应填()。

A.
solve(1, n, 1)
B.
solve(1, n, 0)
C.
solve(0, n - 1, 1)
D.
solve(1, n + 1, 1)

正确答案A

解析详情
答案 A笛卡儿树
思路与推导
  1. 初始时,中序遍历为整个序列 a[1]..a[n]。根据 for (int i=left; i<=right; i++)

  2. left, right 两端是都包含的,所以传入 1,n。而 deep 的初始值为根节点的深度,题目说了是 1。

三、完善程序(2)

基环树是一个具有 n 个顶点和 n 条边、无重边且连通的无向图。基环树上有且只有唯一的一个环(可能是自环)。输入一棵基环树,输出环的大小。

输入数据:第一行一个整数 n,表示节点数,随后 n 行每行两个数 u, v,表示节点 u 和 v 之间有一条无向边。输入数据保证无重边且连通。

输出要求:一个正整数,表示环的大小。

#include <iostream>
#include <cstdlib>
using namespace std;

int n, d[109], hd[109], tot;
struct edge { int t, nxt; } es[509];

void add(int u, int v) {
    es[++tot] = (edge){①};
    hd[u] = tot;
}

void dfs(int u, int fa) {
    for (int i = hd[u]; ②; i = es[i].nxt) {
        int v = es[i].t;
        if (③) {
            if (d[v] == 0) {
                d[v] = d[u] + 1;
                dfs(v, u);
            } else {
                cout << ④ << endl;
                exit(0);
            }
        }
    }
}

int main() {
    cin >> n;
    for (int i = 1, u, v; i <= n; i++) {
        cin >> u >> v;
        add(u, v);
        add(v, u);
    }
    d[1] = 1;
    dfs(⑤);
    return 0;
}

第 39 题(单选题,3 分)

①处应填()。

A.
v, hd[v]
B.
v, hd[u]
C.
u, hd[v]
D.
v, nxt[u]

正确答案B

解析详情
答案 B基环树环检测
思路与推导
  1. 此处是链式前向星加边,边(u, v)会被插入到头指针 hd[u] 前面(虽然是无向图,但后面一句是 hd[u],所以只能视 u 为起点,v 为终点)。

第 40 题(单选题,3 分)

②处应填()。

A.
!i
B.
~i
C.
i
D.
i >= 0

正确答案C

解析详情
答案 C基环树环检测
思路与推导
  1. 前向星的终点,nxt 指针一般取值为 0 或 -1,本题中 nxt(从 hd 获得的值)并没有初始化为 -1 等操作,所以默认值是 0。这里当 i 非零时则继续循环。

第 41 题(单选题,3 分)

③处应填()。

A.
v
B.
v != fa
C.
v == 0
D.
fa != -1

正确答案B

解析详情
答案 B基环树环检测
思路与推导
  1. 因为输入是双向图,所以需避免沿进入的边走回到父节点去。注意本题因为保证没有重边,所以这样写才是对的。如果有重边(2阶环),这么写会误跳过重边。这时候 fa 应该传边的 id 进来,才能区分 v==fa 是反向边还是重边。

第 42 题(单选题,3 分)

④处应填()。

A.
d[u] - d[v]
B.
d[fa] - d[v]
C.
d[u] - d[v] + 1
D.
u - v

正确答案C

解析详情
答案 C基环树环检测
思路与推导
  1. 这里 v 是 u 的祖先,从 v 到 u 沿途的节点(包括 u, v)构成环,所以环上的节点数等于深度差加一。

第 43 题(单选题,3 分)

⑤处应填()。

A.
0, -1
B.
0, 0
C.
1, 1
D.
1, -1

正确答案D

解析详情
答案 D基环树环检测
思路与推导
  1. 主函数应从根节点开始调用,因为前面写的是 d[1]=1,所以这里 1 是根节点,第一个参数要传 1。第二个参数是父节点编号,但根节点没有父节点,根据 ③ 处的选项,这里只要传入一个 1..n 之外的数就行。