CSP-J/S 第一轮备考
算法基础 · 阅读程序 · 完善程序
复杂度 · 排序 · 数据结构 · 图论 · 树 · 阅读/完善程序技巧
P03-P04 算法基础复杂度 · 排序 · 稳定性 J/S共有
P05-P06 线性结构队列/栈 · 链表 J/S共有
P07-P08 图论概念 · 存储 · DFS/BFS J/S共有
P09-P13 树树/二叉树 · 遍历 · 表达式树 · 哈夫曼 J/S共有
P14-P16 阅读程序题型 · 破题手段 · C++ 细节 J/S共有
P17-P18 完善程序出题点 · 破题技巧 J/S共有
试卷 硬件 编码 语言 系统
知识体系总览
页码知识点核心内容
P03算法基础排序、贪心、递归、递推、二分、倍增;复杂度
P04排序冒泡/选择/插入/计数原理与 sort;稳定性
P05队列/栈FIFO / LIFO、O(1) 入出、空间 O(n)
P06链表单/双/循环链表、数组对比、头插
P07图论概念无向/有向/混合、度数/入度/出度、完全图、强/弱连通
P08图存储与遍历邻接矩阵/表、DFS/BFS、BFS 最短路
P09n 结点 n-1 边、深度/高度/子树、链/菊花/二叉树
P10二叉树完整/完全/满/完美、二叉搜索树、平衡树
P11遍历前/中/后序、由中序+一种推另一种
P12表达式树前缀/中缀/后缀
P13哈夫曼WPL、构造算法、哈夫曼编码、前缀码
P14-P16阅读程序题型介绍、破题手段、C++ 细节(常量/类型/优先级)
P17-P18完善程序流程控制/状态变化/初始化、对称性/变量使用
P20-P22限时练习算法基础、阅读程序、完善程序 真题
一句话主线:算法基础 = “复杂度 + 排序 + 数据结构 + 图论 + 经典模型”;阅读/完善程序先把代码“当程序”读,再把“边界、优先级、递归出口”当考点。
[★] 备考要点:选择题爱考复杂度与数据结构性质;阅读程序重在“模拟 + 找规律”;完善程序重在“状态 + 边界”。
算法基础概览 J/S共有
基础算法包括:排序、贪心、递归、递推、二分、倍增
时间复杂度:用大 O 表示运算量的增长趋势;只保留增长最快的若干项、省略常系数与低阶项。
时间复杂度的常见量级
量级典型举例
O(1)常数数组按下标访问
O(log n)对数二分查找、倍增
O(n)线性单层循环、求和
O(n log n)线性对数归并/快排、调和级数
O(n^2)平方双层循环、冒泡/选择/插入
O(2^n)指数枚举子集、DFS 选/不选
O(n!)阶乘全排列、next_permutation
// 复杂度// n + (n-1) + ... + 1 = n(n+1)/2 次 -> O(n^2) // 调和级数 n(1 + 1/2 + ... + 1/n) = O(n log n) // dfs(1):每个元素选/不选 -> O(2^n) // next_permutation:n! 趟 × 每趟 O(n) -> O(n! * n)
[!] 大 O 细节:当输入规模可用一个变量 n 表示时,大 O 里只有一项且不含常系数;当输入规模需多个变量表示时,可有多项,如 O(n+q)、O(nm);与 n 无关记 O(1);对数 log_b(a) 中 b 为常数时一般省略。
[!] 特殊结论:调和级数 1 + 1/2 + … + 1/n = O(log n),需记住。
[?]【练习】下列代码复杂度为( )。
for (int i=1;i<=n;++i) for (int j=i;j<=n;++j) swap(a[i],a[j]);
A. O(n) B. O(n log n) C. O(n^2) D. O(n^2 log n)
答案:C
约 n(n+1)/2 次,量级 n^2。
[★] 口诀:“单层线性、双层平方、乘 2 折半对数、全排列阶乘;先估量级再模拟。”
排序算法与稳定性 J/S共有
排序:将一系列数据按某种顺序排列。CSP-J 考纲要求掌握冒泡排序、选择排序、插入排序、计数排序的原理与应用,以及 sort 的运用。
稳定性:指相等的元素排序后相对顺序是否改变。
算法平均复杂度最坏复杂度是否稳定
冒泡排序O(n^2)O(n^2)
选择排序O(n^2)O(n^2)
插入排序O(n^2)O(n^2)
计数排序O(n+w)O(n+w)
归并排序Θ(n log n)Θ(n log n)
快速排序O(n log n)O(n^2)
计数排序:n 为元素个数、w 为值域大小;基于桶统计,适合值域小的整数排序,可突破 O(n log n) 的下界。
归并排序:分治,先拆后合,稳定,可统计逆序对 O(n log n)。
快速排序:选基准分区,递归;最坏 O(n^2)。
[?]【CSP-J 2022 T12】以下说法错误的是( )。
A. 冒泡排序稳定 B. 简单选择排序稳定 C. 简单插入排序稳定 D. 归并排序稳定
答案:B
简单选择排序不稳定。
[★] 口诀:“平方算法:选择/插入/冒泡;nlogn:归并/快排/堆;稳定:插入、冒泡、归并、计数。”
队列与栈 J/S共有
队列:先进先出 FIFO,队尾入队、队首出队。
栈:后进先出 LIFO,栈顶 push / pop。
空间复杂度:O(n)(n 个元素);入/出操作时间:O(1)。
典型应用:栈——括号匹配、函数调用、后缀表达式、DFS;队列——BFS、消息队列。
[?]【GESP 202403 六级 T9】空栈执行:push(1), push(2), push(3), pop(), pop(), push(4), push(5), pop(),最终栈内元素是( )。
A. 1,2 B. 1,4,5 C. 1,2,5 D. 1,4
答案:D
push1,2,3 → pop3、2 → push4,5 → pop5 → 剩 [1,4]。
[?]【CSP-J 2021 T5】入栈顺序 a,b,c,d,e,下列( )不是合法出栈序列。
A. a,b,c,d,e B. e,d,c,b,a C. b,a,c,d,e D. c,d,a,e,b
答案:D
出 c、d 后栈顶为 b,无法先出 a。
[★] 口诀:“栈后进先出,队列先进先出;括号匹配/DFS/后缀用栈,BFS 用队列。”
链表 J/S共有
链表特点:插入与删除非常方便,O(1);寻找与读取较慢,O(n)。
数组特点:寻找/读取 O(1);插入/删除中间元素 O(n)。
三种链表:
• 单向链表:next 连接当前与下一结点;
• 双向链表:prev 与 next 分别指向前/后结点;
• 循环链表:最后一个结点的 next 指向第一个结点。
// 链表struct Node { int data; Node* next; }; // 头插:在链表头部插入 data=42 的新结点 Node* newNode = new Node; newNode->data = 42; newNode->next = head; head = newNode;
[?]【CSP-J 2020 T7】链表不具有的特点是( )。
A. 可随机访问任一元素 B. 不必事先估计存储空间
C. 插入删除不需要移动元素 D. 所需空间与线性表长度成正比
答案:A
链表不可随机访问,只能顺序遍历。
[?]【CSP-J 2023 T4】在链表头插入 data=42 的新结点,正确操作是( )。
A. newNode->data=42; newNode->next=head; head=newNode;
B. head->data=42; newNode->next=head; head=newNode;
C. newNode->data=42; head->next=newNode;
D. newNode->data=42; newNode->next=head;
答案:A
要先设 newNode->next=head,再让 head 指向 newNode;否则会丢链。
[★] 口诀:“链表插入删 O(1)、访问 O(n);数组相反。头插先接旧头,再改头指针。”
图论概念 J/S共有
图由若干结点(点集 V)与若干条边(边集 E)组成,记 G=(V,E)。
无向边/有向边:边 e=(u,v) 是否区分顺序(u→v);
无向图/有向图/混合图:仅含无向边/有向边/二者均有;
带权图/正权图:每条边赋权值 w;
度数 d(v)/出度 d+(v)/入度 d-(v):与 v 相连的边数 / 以 v 为起点的边数 / 以 v 为终点的边数;
自环:e=(u,u);重边:两条边完全相同;简单图:无重边、无自环;
连通:无向图中任意两点间存在一条途径;稠密/稀疏:边数接近/远小于点数平方;
完全图:任意不同两点间均有边(无向)/均有两条方向不同的边(有向);
强连通:有向图中任意 u,v 之间 u→v 且 v→u 均可达;弱连通:把有向边换成无向边后连通。
[?]【GESP 202403 七级 T4】一个连通的简单无向图共有 28 条边,该图至少有( )个顶点。
A. 6 B. 7 C. 8 D. 9
答案:C
n 个顶点的完全图边数 n(n-1)/2 ≥ 28,n≥8。
[?]【GESP 202406 七级 T9】关于图的说法正确的是( )。
A. 无向图环至少包含三个不同顶点且首尾相同
B. 有向图环是一个顶点经至少另一个顶点到自身的路径
C. 有向图任意两点间存在一条边则一定强连通
D. 有向图所有顶点的入度和出度之和等于边数的两倍
答案:D
每条边贡献一个入度一个出度,总和 = 2×边数。
[★] 口诀:“图=点+边;完全图 n(n-1)/2;入度出度和=2m;连通无论向,强连通要双向。”
图的存储与遍历 J/S共有
邻接矩阵:二维数组 e,e[u][v]=1 表示有边(=0 无),带权图可存边权。
• 优点:O(1) 查询是否存在一条边;
• 缺点:对于稀疏图空间复杂度过劣。
邻接表:用 vector 存储一个结点所有出边信息(终点与权)。
• 优点:空间复杂度 O(|E|)。
遍历顺序用到的结构用途
DFS一条路走到黑栈 / 递归连通性、回溯、排列枚举
BFS一层层扩展队列无权最短路、层序遍历
// 图// 邻接表 + DFS void dfs(int u){ vis[u] = 1; for(int v : g[u]) if(!vis[v]) dfs(v); }
[?]【CSP-J 2022 T9】N 个元素构成的有向连通图,用邻接矩阵表示时至少存在( )个非零元素。
A. N-1 B. N C. N+1 D. N^2
答案:B
前 N 个点可成链,至少 N 条边(含方向),故至少 N 个非零。
[?]【GESP 202312 七级 T9】广度优先搜索除标志数组外还需( )结构存放结点。
A. 双向栈 B. 队列 C. 哈希表 D. 堆
答案:B
BFS 用队列。
[?]【CSP-J 2021 T14】以 a 为起点对无向图 DFS,b,c,d,e 中可能作为最后一个遍历到的点的个数为( )。
A. 1 B. 2 C. 3 D. 4
答案:B
取决于 DFS 顺序,b、c、d、e 中只有 2 个可能最后到达。
[★] 口诀:“矩阵查边快、表省空间;DFS 用栈、BFS 用队列;BFS 可求无权最短路。”
树形数据结构 J/S共有
树:n 个结点、n-1 条边的无向连通图;指定根后为有根树。
性质:① 任意不同两点间添加一条边,所得图有唯一一个环;② 任意两个结点间仅有一条简单路径。
术语:父亲、祖先、子结点、结点深度(到根的边数)、树高(最大深度)、子树。
特殊的树
链:与任一结点相连的边不超过 2 条的树;
菊花:存在结点 u 使所有除 u 外结点均与 u 相连;
二叉树:每个结点最多有两个儿子的有根树。
[?]【CSP-J 2021 T6】n 个顶点、m 条边的无向连通图(m>n),需删( )条边才能成为树。
A. n-1 B. m-n C. m-n-1 D. m-n+1
答案:D
树共有 n-1 条边,需删 m-(n-1)=m-n+1。
[★] 口诀:“树 = 点 - 1 条边 + 连通无环;删边变树:删 m-n+1 条;链、菊花、二叉树三种特殊树。”
二叉树与二叉搜索树 J/S共有
二叉树:每个结点最多两个儿子的有根树。
完整二叉树:每个结点子结点数量均为 0 或 2;
完全二叉树:只有最下面两层结点度数可小于 2,且最下层结点集中在该层最左边连续位置;
满/完美二叉树:所有叶结点深度相同、所有非叶结点子结点数均为 2。
二叉搜索树:对每个结点 u,若左子树非空则其内所有点权 < u;若右子树非空则其内所有点权 > u;且左右子树均为二叉搜索树。
平衡树:二叉搜索树 + 每个结点左右子树高度差最多为 1(实际定义随维护方式而异)。
[?]【GESP 202406 六级 T10】一棵 5 层的满二叉树中节点数为( )。
A. 31 B. 32 C. 33 D. 16
答案:A
满二叉树 2^5 - 1 = 31。
[?]【GESP 202309 六级 T11】有关某二叉树的说法正确的是( )。
A. 既是完全二叉树也是满二叉树 B. 既是二叉搜索树也是平衡二叉树
C. 非平衡二叉树 D. 以上都不正确
答案:B
由树形判断(左小右大且高度差≤1)为二叉搜索树且平衡。
[★] 口诀:“完全只瘪最后两层且靠左;满/完美每层满;二叉搜索树左小右大;平衡树高度差≤1。”
二叉树的遍历 J/S共有
• 前序(先序):根、左、右;  • 中序:左、根、右;  • 后序:左、右、根。
例:前序 FBADCEGIH,中序 ABCDEFGHI,后序 ACEDBHIGF。
由中序 + 一种遍历可重构树:① 前序第一个是根(后序最后一个是根);② 根在中序中左边为左子树、右边为右子树;③ 对每个子树重复。
[?]【CSP-J 2019 T14】后序 DGJHEBIFCA,中序 DBGEHJACIF,则前序为( )。
A. ABCDEFGHIJ B. ABDEGHJCFI C. ABDEGJHCFI D. ABDEGHJFIC
答案:B
后序最后 A 为根,递归划分左右子树得到 ABDEGHJCFI。
[★] 口诀:“前根左右、中左根右、后左右根;前序找根、中序分左右,递归即可重构。”
表达式树 J/S共有
表达式树:叶子为数值/变量,非叶子为运算符的二叉树。
在表达式树上:
• 前序遍历 → 前缀表达式(波兰表达式);
• 中序遍历 → 中缀表达式;
• 后序遍历 → 后缀表达式(逆波兰表达式)。
例:前缀 -/+6*2345;中缀 (6+2*3)/4-5;后缀 23*6+4/5-。
// 后缀// 后缀求值:扫描,数字压栈,遇运算符弹两数计算再压栈
[?]【CSP-J 2023 T8】后缀表达式 6 2 3 + - 3 8 2 / + * 2 ^ 3 + 对应的中缀是( )。
A. ((6-(2+3))*(3+8/2))^2+3
B. 6-2+3*3+8/2^2+3
C. (6-(2+3))*((3+8/2)^2)+3
D. 6-((2+3)*(3+8/2))^2+3
答案:A
逐步还原:先 6-(2+3),再 3+(8/2),相乘后 ^2 再加 3。
[★] 口诀:“后缀用栈;符号出现顺序决定运算顺序;还原时注意括号分组。”
哈夫曼树与哈夫曼编码 J/S共有
设二叉树有 n 个带权叶结点,根到叶的路径长度 l_i 与叶权值 w_i 之积的和称为带权路径长度 WPL = Σ w_i·l_i
给定一组带权叶结点,构造 WPL 最小的二叉树即为哈夫曼树
构造算法
① 由 n 个权值构造 n 棵仅含根结点的二叉树,记集合 F;
② 从 F 中选取根结点权值最小的两棵 T1、T2 作为左右子树,新建 T3,其根权值为 T1、T2 根权值和;
③ 从 F 删除 T1、T2,加入 T3;
④ 重复直到 F 只剩一棵树,这棵树即为哈夫曼树。
哈夫曼编码
将字符集及出现频率作为叶结点构造哈夫曼树;规定左分支代表 0、右分支代表 1,从根到叶的 0/1 序列即该字符编码。
特点:频率高的字符编码短、频率低的长,实现压缩;是前缀编码(任一编码都不是其他编码的前缀),且是前缀编码中最短的,属于贪心思想
[?]【GESP 202309 六级 T9】字符 A~G 概率 0.40,0.30,0.15,0.05,0.04,0.03,0.03,若 B 的编码为 11,则 D 的编码为( )。
A. 10010 B. 10011 C. 10111 D. 10001
答案:B
按哈夫曼构造,D 的编码为 10011。
[?]【CSP-J 2023 T10】字符 a~f 频率 5%,9%,12%,13%,16%,45%,下列哪组是对应的哈夫曼编码?( )
A. 1111,1110,101,100,110,0
B. 1010,1001,1000,011,010,00
C. 000,001,010,011,10,11
D. 1010,1011,110,111,00,01
答案:A
f(45%) 应最短(0),其余按频率递增编码变长,A 满足前缀码且频率越高越短。
[★] 口诀:“每次取两最小合并;WPL=权×路径和;左 0 右 1;前缀码不冲突;频率越高编码越短。”
阅读程序题型介绍 J/S共有
给定一个 C++ 代码,阅读并理解程序作用,完成判断题与选择题。
题数:三大题,每大题 5-7 小题,总分 40 分;前面若干个判断题、后面若干个选择题,是最大的一个部分
程序类型:没实际意义的语言性质题、基于算法/数据结构的简单题、稍复杂模拟题、动态规划题、考察 C++14 语言特性的题等。
破题手段
• 拿到题先宏观分析程序;
• 看题目与数据范围,找功能提示;
• 观察是否有熟悉算法,猜测功能;
• 对确定的功能做笔记;
• 对小的数据模拟分析(用草稿本)。
[!] 典型例子:数字常量 0x33(16 进制)、013(8 进制)、1LL(long long 后缀)在题目中要能一眼识别。
[★] 阅读程序口诀:“先看数据范围定规模,再找熟悉的算法猜功能,最后小数据模拟 + 抓住边界。”
阅读程序五大题型 J/S共有
题型设问方式解题思路
复杂度分析题程序(或其中一部分)的时间复杂度?先判断是否熟悉算法;确定循环层数与每层规模;注意调和级数、二分等特殊情况;极少量递归可用主定理
程序改动题某语句改成另一种,程序结果不变?(判断)确定语句作用;两语句比较差异,构造引起差异的数据代入验证
输入输出题输入 xxx 输出什么?输入超过 xxx 是否会发生某情况?确定程序整体功能;按功能处理输入;注意边界情况
中间结果题某部分执行了多少次?某变量在某种情况下值?确定程序与变量功能;按上下文模拟步骤计算
程序功能题某部分是什么功能?构造数据使满足要求?理解程序功能;观察测试数据与输入输出性质
[?]【练习】阅读程序时,下列哪个最应优先检查?( )
A. 函数名是否好看 B. 循环边界与数组下标是否越界
C. 注释是否清晰 D. 变量名是否简短
答案:B
越界、除法、溢出、优先级是阅读程序高频陷阱。
[★] 口诀:“五大题型:看复杂度、看改动、看输入输出、看中间结果、看功能。”
C++ 知识细节(阅读程序必备) J/S共有
有符号与类型
类型字节说明
int4默认有符号
short2
char1
long long8
long4 或 8视平台
signed/unsignedsigned 可省略默认;unsigned 只能表示非负整数
C++ 运算符优先级与结合性(1 最优先)
// 优先级1 () [] . -> 从左到右 2 ! ~ + - ++ -- * & 单目,从右到左 3 * / % 双目,从左到右 4 + - 从左到右 5 << >> 从左到右 6 > >= < <= 比较,从左到右 7 == != 相等,从左到右 8 & 按位与,从左到右 9 ^ 按位异或,从左到右 10 | 按位或,从左到右 11 && 逻辑与,从左到右 12 || 逻辑或,从左到右 13 ?: 三目,从右到左 14 = += -= *= /= %= <<= >>= &= |= ^= 复合赋值,从右到左 15 , 逗号,从左到右
进制换算、位运算、溢出都是阅读程序常见考点。
注意:有符号与无符号的比较、移位对负数(算术右移 vs 逻辑右移)、char/short 溢出等都是陷阱。
[★] 口诀:“先算术、再比较、后位运算、再逻辑;位与>异或>位或;赋值与三目从右到左。”
完善程序题型与出题点 J/S共有
给定问题描述 + 一个有 6 个空缺的 C++ 代码,可能有解法提示,也可能没有。读懂程序后,从选项中选最合适的一项。
题数:两大题,每大题 5 小题,总分 30 分
三个主要出题点
出题点考察重点解题技巧
流程控制循环/条件判断的条件与流程选择了解循环/条件作用;知道不同变量作用与语句功能;猜测条件;特别注意边界
状态变化模拟、DP、搜索、递推中的变量状态转移了解附近代码作用;区分不同变量的作用;按上下文决定变量/状态转移
初始化对某个变量初始化先明确上下文;确定哪个变量应初始化;根据后文确定初始化值
[★] 完善程序口诀:“先定状态与转移,再补边界与初始化;代入选项用 1-2 组小数据验证。”
完善程序破题技巧 J/S共有
对称性
不同题目间的对称性:题目可能两段相似(多在搜索、DP 中),选项也可能相似,注意变量细节;
单独题目内的对称性:比较选项差异,注意边界条件、看似等价是否真等价、顺序是否有关。
变量使用
• 所有变量都是有用的:变量使用前一定初始化,赋值后一定会被使用;
空格后面出现没出现过的变量 → 本空是初始化;
空格后面没出现选项涉及的变量 → 可能被输出;
• 前面初始化/赋值读入后应当会被使用(赋值给其他变量或输出)。
[?]【例题核对 DCCDB】完善程序常以“DCCDB”为答案串。以下说法正确的是( )。
A. 每空都一定在改同一个变量
B. 空格后出现新变量多是初始化
C. 选项相似的填空应优先选“看起来等价”的那个
D. 变量使用顺序无关紧要
答案:B
“空格后出现没出现过的变量”是初始化标志;C 中看似等价未必等价,需验证。
[★] 口诀:“所有变量都有用;先初始化、后使用;空格后新变量→初始化;用对称性找差异,用小数据验证。”
知识速查
复杂度1 < logn < n < nlogn < n^2 < 2^n < n!
排序稳定:插入/冒泡/归并/计数 · nlogn:归并/快排/堆
队列/栈FIFO/LIFO · O(1) 入出 · BFS 用队列 · 括号/后缀用栈
链表插入删 O(1) · 访问 O(n) · 单/双/循环
邻接矩阵查边快 · 邻接表省空间 · DFS 栈 / BFS 队列
n 点 n-1 边 · 完全/满/搜索/平衡 · 边 m-n+1 删成树
遍历前根左右 · 中左根右 · 后左右根 · 前序找根
表达式后缀用栈 · 前中后对应表达式树
哈夫曼WPL 最小 · 左 0 右 1 · 前缀码 · 贪心
C++int4 · ll8 · 常量 0x/0 · 优先级表(1-15)
综合练习
[?]【综合1】n 扩大一倍,O(n log n) 算法耗时约为原来的( )。
A. 2 倍 B. 约 2+2/log₂n 倍 C. 4 倍 D. log₂n 倍
答案:B
T(2n)/T(n) ≈ 2 × (log₂n+1)/log₂n = 2 + 2/log₂n。
[?]【综合2】前序 ABCDEFG、中序 CBEDAFG,则后序为( )。
A. CEDBFGA B. CEDBGFA C. CEDBFAG D. CBEDFGA
答案:A
前序定根,递归分左右,得后序 CEDBFGA。
[?]【综合3】后缀 3 4 5 * + 6 - 的值是( )。
A. 11 B. 13 C. 17 D. -3
答案:C
3 + (4×5)=23,再 -6=17。
[★] 备考建议:先背复杂度与排序,再刷数据结构与图论;阅读程序重点“模拟+陷阱”,完善程序重点“状态+边界”。考前把 DCCDB 这类答案核对一遍。
限时练习:算法基础(CS2 随堂测验 选择 + 完善)
第 1 题:递归函数 h(x)=x-2,f(x) 若 x<=1 return 1,否则 return x * f(h(x))。若执行 f(6),返回( )。A. 24 B. 48 C. 120 D. 720
第 2 题:给定空栈 S,对 a,b,c,d,e 依次进行 进栈、进栈、进栈、出栈、进栈、出栈、进栈、出栈,栈内剩下的元素不包含( )。A. a B. b C. c D. d
第 3 题:双向链表双指针 llink、rlink,在 p 前插入 q,正确的插入顺序是?A/B/C/D 四个选项(涉及 rlink/llink 的先后赋值)
第 4 题:长度 300000 数组查找 val,说法错误的是?A. 顺序查找最坏 300000 次 B. 下标 i 的元素值为 i²,可用二分查找完成 C. 二分查找不超过 19 次判断 D. 值域小可用计数法
第 5 题:无向图 m 条边,所有结点度数之和为( )。A. m B. 1.5m C. 2m D. 3m
第 6 题:不符合树的性质的是?A. 边数为结点数减 1 B. 删任意一条边分成两个互不连通部分 C. 任意两点连一条边形成简单环 D. 任意两点有多条简单路径可达
第 7 题:8 个顶点的完全图至少要删( )条边才能变为森林?A. 20 B. 21 C. 22 D. 23
第 8 题:给定二叉树后序遍历为( )?
第 9 题:中缀 a+b*(c-d)/e-f 的后缀表达式是( )。A. f-e/d-d*b+a B. +ab*-cd/e-f C. abcd-*e/f+- D. -+a/b*cd-ef
第 10 题:某文本字符 abcdef 频次 120/150/50/230/105/330,哪组是哈夫曼编码?A. 1,10,11,100,101,110 B. 110,11,101,10,100,1 C. 101,100,000,01,001,11 D. 100,111,01,101,110,00
[?]【核对 5】无向图 m 条边,度数和?
答案:C(2m)
每条边贡献两个度。
[?]【核对 9】a+b*(c-d)/e-f 后缀?
答案:C
按运算顺序转后缀得 abcd-*e/f+-。
[★] 提示:这是 CS2 的“随堂测验(第一、二部分)”,建议 30 分钟完成。
限时练习:完善程序(CS2 树宽度)
题目:给一棵 n 个结点的树(根 1),定义树的“宽度”为树上同一层最多的结点数。输入树,求出树的宽度。
代码框架:用 queue 做 BFS 层序遍历,q1 存整层、q2 存下一层;维护 ans = max(层内个数)。
// 完善程序queue<node> q1, q2; q1.push({1, 1}); while ( ① ) { node u = q1.front(); q1.pop(); for ( ② ) { if ( ③ ) { q2.push({v, u.x}); } } if ( ④ ) { if (q2.size() > ans) ans = q2.size(); q1 = q2; } while (!q2.empty()) ⑤; } cout << ans;
A. q1.empty() B. q2.empty() C. !q1.empty() D. !q2.empty()
A. node v : G[u] B. int v : G[u.x] C. int v = q1.front().x; v!=n; v++ D. int v = q2.front().x; v!=n; v++
A. !q1.empty() B. v.fa != u C. !q2.empty() D. v != u.fa
A. q1.empty() && !q2.empty() B. !q1.empty() && q2.empty()
     C. q2.front().x == u.x D. q2.front().x == n
A. q1.push(q2.front()) B. q2.pop() C. ans += (q1.front() > 0) D. ans += (q2.front() > 0)
[?]【答案核对】①~⑤ 分别选?
答案:C、B、D、A、B(以讲评为准)
①!q1.empty();②for(int v : G[u.x]) 遍历邻接表;③v != u.fa(树中避免回到父结点);④q1.empty() && !q2.empty()(当前层结束且下一层非空);⑤q2.pop()(清空分层队列)。
[★] 提示:这是“树的宽度”完整程序题,BFS 层序 + 分层计数。
限时练习:CS5 阅读程序与完善程序
【阅读程序】(1) 输入 n 及 n 个 [0,10⁵] 整数,程序第 11/13 行做插入排序式冒泡,最后从小到大输出。
判断题:1. 第 13 行 if 判断在运行中共执行 n(n-1)/2 次。( )2. 若输入 n 超过 1009,数组将装不下后面输入的数字。( )3. 将第 11 行改为 for(int i=1; i<=n; i++),程序功能改变。( )4. 程序功能是将输入整数按从小到大输出。( )
选择题:5. 时间复杂度为( )。A. O(n) B. O(数组 a 的值域范围) C. O(n log n) D. O(n^2)
6. 若输入 “6 1 3 2 2 2 1 3”,输出为( )。A. 2 2 2 B. 1 1 2 2 3 3 C. 3 3 2 2 1 1 D. 3 2 1
[?]【核对 5】该阅读程序时间复杂度?
答案:D(O(n^2))
双重循环互为相邻比较交换,最坏 O(n^2)。
[?]【核对 6】输入序列输出?
答案:B
从小到大输出 1 1 2 2 3 3。
【阅读程序】判断/选择(CS5 第二篇):程序统计满足 1≤p≤q≤m 的 (p,q) 计数并累加 b 到 sum。判断:7. 输入 p、q 超过 m 不会越界。( )8. sum 变量可不初始化。( )9. 第 16、17 行交换位置,结果不变。( )10. 第 15 行 i=1 改为 i=0,结果不变。( )选择:11. 第 12、13 行的 p 和 q+1 分别改为 p-1 和 q,输出结果( )。A. 变大 B. 变小 C. 不变 D. 都有可能
12. 当输入 “4 4 1 2 2 2 3 3 3 1 3” 时,输出为( )。A. 6 B. 10 C. 7 D. 8
[?]【核对 11】p/q+1 改为 p-1/q 后的输出?
答案:B(变小)
统计范围变窄。
[?]【核对 12】按题意统计得输出?
答案:C(7)(以讲评为准)
按要求遍历输入的 (p,q) 与加法统计,得输出 7。
[★] 提示:这是 CS5 的“限时练习(阅读程序 + 完善程序)”,建议 40 分钟完成;第 13-17 题为“二进制转十进制、统计 1 的个数”的完善程序,答案串为 DCCDB。
100%