GESP2025年12月认证C++六级真题与解析(单选题8-15)

GESP2025年12月认证C++六级真题与解析(单选题8-15)

✅ 第 8 题:哈夫曼树如何“合并两个最小节点”


📘 本题考什么?

这道题不是考你会不会写哈夫曼编码,
而是考你是否真正理解👇

哈夫曼树在“合并两个最小节点”时,
新节点到底是什么?
要放进哪一个队列?

📌 正确答案:A


1、先认识 3 个“重要角色”(非常关键)

🧱 1️⃣ Node 结构体(树节点)

struct Node { long long w; // 权值(频率) int l, r; // 左右孩子(下标) int sym; // 叶子:符号下标;内部节点:-1 }; 

👉 记住一句话:

节点类型sym
叶子节点≥ 0
内部节点-1

🎵 2️⃣ leafIdx(A 队列)

vector<int> leafIdx; 

👉 这里放的是:

原始字符对应的“叶子节点”下标
  • 一开始就排好序
  • 只用于“最初的叶子”

🧩 3️⃣ internalIdx(B 队列)

vector<int> internalIdx; 

👉 这里放的是:

合并出来的新节点(内部节点)

2、哈夫曼算法的核心流程

🌳 哈夫曼树是这样长出来的:

1️⃣ 找到 当前权值最小的两个节点
2️⃣ 把它们合并成一个 新爸爸节点
3️⃣ 新节点:

  • 权值 = 两个孩子的权值之和
  • 左右孩子 = 这两个节点
  • 不是叶子!

4️⃣ 把新节点放入 内部节点队列
5️⃣ 重复,直到只剩一个根


3、回到关键代码(第 3 步)

int x = PopMinNode(...); int y = PopMinNode(...); int z = (int)nodes.size(); ________________________ 

现在问题是👇
👉 合并 x 和 y 之后,这一行应该写什么?


4、一步一步分析“新节点 z 是什么”

🧠 新节点 z 的身份

属性应该是什么
权值 wnodes[x].w + nodes[y].w
左孩子 lx
右孩子 ry
sym-1(不是叶子)

👉 所以,新节点的正确创建方式是:

Node(nodes[x].w + nodes[y].w, x, y, -1) 

5、新节点 z 应该放进哪个队列?

❓ 能放进 leafIdx 吗?

绝对不行!

因为:

  • leafIdx 只放 原始字符
  • 新节点不是字符,是“合并节点”

✅ 正确答案

新节点必须放进 internalIdx(B 队列)

6、所以正确代码只能是👇

nodes.push_back(Node(nodes[x].w + nodes[y].w, x, y, -1)); internalIdx.push_back(z); 

👉 这正是 A 选项


7、逐个“打死”错误选项(非常重要)

❌ B 选项

nodes.push_back(...); leafIdx.push_back(z); 

❌ 错在:

  • 把“内部节点”
  • 当成“叶子节点”

👉 逻辑错误


❌ C 选项

internalIdx.push_back(z); nodes.push_back(Node(..., x+y)); 

❌ 两个大错:

1️⃣ sym = x + y

  • 内部节点的 sym 必须是 -1

2️⃣ 先 push index,再 push node

  • z 指向了不存在的节点!

👉 逻辑 + 顺序双错


❌ D 选项

nodes.push_back(Node(..., x+y)); leafIdx.push_back(z); 

❌ 错上加错:

  • sym 错
  • 队列错

8、给小学生的“记忆口诀”⭐

🧠 哈夫曼合并三原则:

1️⃣ 新节点不是字符 → sym = -1
2️⃣ 新节点是内部节点 → 放 internalIdx
3️⃣ 叶子队列只放最初的字符

9、用一个“小画面”帮助记忆 🎨

叶子 A(2) 叶子 B(3) \ / \ / 新节点 C(5) ← 不是字符! 

👉 C:

  • 权值 5
  • 有左右孩子
  • 必须进 internalIdx

✅ 最终总结

  • 哈夫曼编码的合并节点:
    • sym = -1
    • 放入 internalIdx
  • 只有 A 同时满足这两个条件
  • 所以本题答案 一定是 A


✅ 第 9 题:关于哈夫曼编码,哪个说法对?


📘 本题考什么?

👉 哈夫曼编码的核心性质
👉 前缀编码


1、先用一句话认识“哈夫曼编码”

🎯 哈夫曼编码是一种:用得多的字符 → 编码短用得少的字符 → 编码长专门用来 压缩数据 的编码方法

2、正确选项:B(为什么一定对)

✅ B:

“哈夫曼编码中,没有任何一个字符的编码是另一个字符编码的前缀”


🧠 这句话什么意思?

👉 前缀
一个编码,是另一个编码的“开头”。

❌ 错误的例子(不是哈夫曼编码)
A : 0 B : 01 
  • 001 的前缀
  • 看到 0,你不知道是 A 还是 B 的一部分

👉 解码会乱掉


✅ 哈夫曼编码一定满足

任何一个编码,
都不会是别人的开头

比如:

A : 0 B : 10 C : 11 

✔ 没有前缀冲突
✔ 一看就能解码

📌 这叫:前缀码(Prefix Code)


🧒 小学生理解

每个密码
都不能“踩到别人门口” 🚪
否则会走错房间

3、错误选项 A:为什么错?

❌ A:

“哈夫曼编码是定长编码”


🧠 什么叫“定长编码”?

每个字符,用的位数都一样
比如 ASCII 编码:
  • 每个字符:8 位(1 个字节)

❌ 哈夫曼编码恰恰相反!

👉 哈夫曼编码是:变长编码

  • 常见字符 → 编码短
  • 罕见字符 → 编码长

🌰 举例

假设:

字符频率哈夫曼编码
A很多0
B110
C很少111

👉 长短不一样!


🧒 记忆

定长 = 人人一样
哈夫曼 = 用得多就短

4、错误选项 C:为什么错?

❌ C:

“哈夫曼编码一定唯一”


🧠 真相是什么?

👉 哈夫曼编码的“长度分配”是最优的
👉 但 具体的 0 / 1 分配方式,不唯一


🌰 举例

假设:

字符频率
A5
B5
C10

可能的哈夫曼编码 1️⃣:

C : 0 A : 10 B : 11 

也可能是 2️⃣:

C : 1 A : 00 B : 01 

👉 都是合法的哈夫曼编码
👉 压缩效果一样
👉 但编码不同


🧒 小学生理解

树左右一换
0 和 1 调个位置
👉 还是对的 🌳

5、错误选项 D:为什么错?

❌ D:

“哈夫曼编码不能用于数据压缩”


🧠 这是完全反着说了!

👉 哈夫曼编码的最大作用就是压缩数据


🌍 真实应用

  • ZIP 压缩
  • 图片压缩
  • 音频压缩
  • 文件压缩

👉 哈夫曼编码是“压缩界的大明星”


🧒 小学生理解

行李箱 🧳
常用的东西放前面
不常用的放后面
👉 更省空间

6、四个选项“对错总表”

选项对 / 错原因
A哈夫曼是变长编码
B前缀码,无歧义
C编码方式不唯一
D本来就是用来压缩的

7、给小学生的本题总结 ⭐

🧠 记住这 4 句话:

1️⃣ 哈夫曼编码是 变长编码
2️⃣ 哈夫曼编码 没有前缀冲突
3️⃣ 哈夫曼编码 不唯一
4️⃣ 哈夫曼编码 专门用来压缩

只要这 4 句话记住,
所有哈夫曼选择题基本都能秒杀



✅ 第 10 题:这段代码在做 BST 的什么操作?


📘 本题考什么?

👉 二叉搜索树(BST)
👉 递归操作


📌 正确答案:B(插入)


👀 关键代码

if (!root) return new TreeNode(x); if (x < root->val) root->left = op(root->left, x); else root->right = op(root->right, x); 

🧠 为什么是插入?

  • 如果树是空的 → 新建节点
  • 小的去左边
  • 大的去右边

👉 完全符合 BST 插入规则


🧒 小学生理解

找位置  → 坐下


✅ 第 11 题:栈实现 DFS,横线填什么?


📘 本题考什么?

👉 深度优先遍历
👉 栈(stack)
👉 访问顺序


📌 正确答案:A

if (node->left) st.push(node->left); 

🧠 为什么?

代码中已经有:

if (node->right) st.push(node->right); 

👉 为了保证:

根 → 左 → 右 

👉 栈是后进先出
👉 右孩子先压,左孩子后压


🧒 口诀

“右先入,左先出”


✅ 第 12 题:判断普通二叉树中是否存在值 x


📘 本题考什么?

👉 广度优先搜索(BFS)
👉 队列


📌 正确答案:C

if (cur->left) q.push(cur->left); if (cur->right) q.push(cur->right); 

🧠 原理讲清楚

  • 普通二叉树 ❌ 没有大小规则
  • 只能 一个一个找
  • 队列,从上到下找

🧒 小故事

教室找人:
第一排 → 第二排 → 第三排
👉 这就是 BFS


✅ 第 13 题:BST 搜索,哪个说法一定对?


📘 本题考什么?

👉 BST 搜索复杂度


📌 正确答案:B

👉 最坏情况:访问所有节点


🧠 为什么?

如果 BST 长这样:

1 \ 2 \ 3 \ 4 

👉 就退化成 链表

👉 搜索要从头走到尾


❌ 其他选项为什么错?

  • A:正常情况是O(logn)
  • C:不一定小于一半
  • D:不一定比普通树快

🧒 记住一句话

BST 搜索,最差可能要全找一遍


✅ 第 14 题:0/1 背包,为什么 j 要倒着走?


📘 本题考什么?

👉 动态规划
👉 0/1 背包


📌 正确答案:B


👀 核心代码

for (int j = W; j >= w; --j) dp[j] = max(dp[j], dp[j-w] + v); 

🧠 为什么要从大到小?

如果从小到大:
👉 同一件物品会被 重复使用
👉 就变成 完全背包


🧒 小故事

一件宝物只能拿一次
所以要 倒着算


✅ 第 15 题:关于动态规划,哪个说法是错的?


📘 本题考什么?

👉 动态规划基本理解


📌 正确答案:B


🧠 为什么 B 错?

动态规划时间复杂度
不是只和状态个数有关

还和:

  • 状态转移次数
  • 循环层数
    有关

✅ 其他选项

  • A:有递推公式 ✔
  • C:有递归 & 递推 ✔
  • D:复杂度通常相当 ✔

Read more

【C++】红黑树详解(2w字详解)

【C++】红黑树详解(2w字详解)

手搓AVL树 * 手搓红黑树 * github地址 * 0. 前言 * 1. 什么是红黑树 * 概念与定义 * 红黑树示例 * 2. 红黑树的性质 * 红黑树的性质解读 * 树的路径再认识 * 3. 红黑树如何确保最长路径不超过最短路径的2倍? * 4. 红黑树的实现 * 整体架构设计 * 结点颜色的枚举类 * 红黑树的结点定义 * 红黑树设计 * 红黑树的插入实现 * 1. 空树的插入 * 2. 新插入节点的父亲为黑色 * 新结点的颜色 * 3. 新插入节点的父亲为红色 * (1)叔叔存在且为红色:变色 + 继续向上处理 * (2)叔叔不存在或叔叔为黑色:旋转 + 变色 * ①LL型:右单旋 + 变色 * ②RR型:左单旋 + 变色 * ③LR型:左右双旋 + 变色 * ①RL型:右左双旋 + 变色 * 4.

By Ne0inhk

C++:实现数组逆置(附带源码)

一、项目背景详细介绍 在所有编程语言与算法体系中,数组逆置(Reverse) 都是一个极其基础、却又极其重要的操作。 你几乎一定在以下场景中见过它: * 数据预处理(反转序列) * 算法步骤中的子过程(如双指针) * 字符串反转、本质就是数组逆置 * 栈结构的底层思想 * 面试中 100% 会出现的基础题 看似简单的一句: reverse(arr.begin(), arr.end()); 背后实际上蕴含着: * 指针 / 下标的本质 * 原地算法思想 * 时间与空间复杂度分析 * 泛型设计能力 1. 为什么“数组逆置”值得单独讲? 原因很简单: 这是理解“算法基本功”的分水岭 很多初学者的问题不是“不会写”,而是: * 写不清楚 * 写不通用 * 写不安全 * 说不明白复杂度 而数组逆置,正好是一个可以把这些问题一次性讲透的例子。 2. 常见错误实现 初学者常见写法包括:

By Ne0inhk
redis学习笔记(八)—— C++ 操作 Redis

redis学习笔记(八)—— C++ 操作 Redis

redis-plus-plus 库 C++ 操作 Redis 的库有很多,这里使用 redis-plus-plus 库 Github 地址: https://github.com/sewenew/redis-plus-plus 安装 hiredis redis-plus-plus 是基于 hiredis 实现的(hiredis 是一个 C语言实现的 redis 客户端) aptinstall libhiredis-dev # Ubuntu yum install hiredis-devel.x86_64 # Centos 下载 redis-plus-plus 源码 git clone https://github.com/sewenew/redis-plus-plus.git 编译安装 redis-plus-plus Ubuntu

By Ne0inhk
华为OD机试双机位C卷:日志解析(C/C++/Java/Python/Go/JS)

华为OD机试双机位C卷:日志解析(C/C++/Java/Python/Go/JS)

日志解析 2026华为OD机试双机位C卷 - 华为OD上机考试双机位C卷 200分题型 华为OD机试双机位C卷真题目录点击查看: 华为OD机试双机位C卷真题题库目录|机考题库 + 算法考点详解 题目描述 你是一个运维工程师,你同时负责n个系统的运维工作,已知每个系统每天会都从现场采集大量的现网运行日志(错误日志、接口日志等)下来生成一个日志文件,每个系统采集下来的日志文件大小均不相同。为了解析这些日志,你给每个系统配备了一台默认服务器进行日志解析,且此台服务器只能给本系统使用,由于所配置的服务器规则均相同,因为解析日志的速度也是相同的,即每秒钟可以解析defaultCnt条日志。 现在你发现解析的速度达不到预期,但你手头上还有一部分额外的资源可以使用,这些资源可以在任意时刻配置给任意一台服务器。但有个限制,那就是同一时刻只能配给其中一台服务器器,且服务器器是能整合全部额外资源,当然在下一秒钟即可配备给另外一台服务器。某一台服务器配备了额外资源以后,则每秒钟会增加解析extraCnt条日志,即每秒可解析(defaultCnt+extraCnt)条日志。 输入描述 输入一

By Ne0inhk