判断题 第 1 题
题目: 构造函数被调用的次数是 1 次。
class Test { public: Test() { cout << "T "; } };
int main() { Test a; Test b = a; }
答案: 错
解析:
代码执行过程如下:
Test a; // 调用构造函数
Test b = a; // 调用拷贝构造函数
一共调用了 2 次构造相关函数。
判断题 第 2 题
题目: 封装:把数据和操作数据的方法放在一起,并隐藏细节。
答案: 对
解析:
封装的核心在于将数据(private)隐藏起来,仅通过公共接口(public)进行操作。
示例:
class BankAccount {
private:
int money; // 外人不能直接碰
public:
void deposit(int x) { money += x; }
};
判断题 第 3 题
题目: 下面代码能正确统计二叉树中叶子结点数量。
int countLeaf(TreeNode* root) {
if (!root) return 0;
if (!root->left && !root->right) return 1;
return countLeaf(root->left) + countLeaf(root->right);
}
答案: 对
解析:
叶子节点定义为没有左孩子且没有右孩子的节点。代码逻辑 if (!root->left && !root->right) 准确判断了该条件。
判断题 第 4 题
题目: 广度优先遍历二叉树可以用栈来实现。
答案: 错
解析:
| 遍历方式 | 数据结构 |
|---|---|
| DFS 深度优先 | 栈 |
| BFS 广度优先 | 队列 |
BFS 的特点是层层推进,遵循先进先出原则,应使用队列而非栈。
判断题 第 5 题
题目: 函数调用的管理可以用栈来完成。
答案: 对
解析:
函数调用遵循后进先出(LIFO)原则。例如调用顺序 f → g → h,返回顺序为 h → g → f,这正是栈的特性。
判断题 第 6 题
题目: BST 中,某结点左子树为空,它一定是整棵树中最小值。
答案: 错
解析:
BST 的最小值位于最左侧的叶子节点。若某节点左子树为空,并不代表它是全局最小值。
反例:
10
/ \
5 7
节点 7 的左子树为空,但最小值是 5。
判断题 第 7 题
题目: 下面函数能正确判断 BST。
bool isBST(TreeNode* root, int minVal, int maxVal) {
if (!root) return true;
if (root->val <= minVal || root->val >= maxVal) return false;
return isBST(root->left, minVal, root->val) && isBST(root->right, root->val, maxVal);
}
答案: 对
解析:
该递归方法通过限制每个节点的取值范围来验证 BST 性质:
- 左子树值 ∈ (minVal, root)
- 右子树值 ∈ (root, maxVal) 每一层都严格限制了合法范围。
判断题 第 8 题
题目: 格雷编码相邻两个编码必须有多位不同。
答案: 错
解析:
格雷码的正确规则是:相邻两个编码只能有 1 位 不同。
示例:
000
001
011
010
每次只变 1 位。
判断题 第 9 题
题目: 从第 1 关到第 4 关最小体力为 7。
cost = [0, 3, 5, 2, 4]
答案: 错
解析:
状态定义: dp[i] 表示到达第 i 关时所需消耗的最小体力。
cost[i] 表示进入第 i 关需要消耗的体力。
状态转移公式:
dp[i] = min(dp[i-1] + cost[i], dp[i-2] + cost[i])
计算过程:
- dp[0] = 0
- dp[1] = 3
- dp[2] = 5
- dp[3] = 5
- dp[4] = 9
到第四关的最小消耗为 9,而非 7。
判断题 第 10 题
题目: 只有一个根节点的树,深度为 1。
答案: 对
解析:
树的深度通常指层数。单节点树只有 1 层,因此深度为 1。
示例结构:
1 (1 层)

