GESP 六级 · GESP 202509 C++ 六级 第 14 题

选择题 · 答案 C · 考点:函数与递归

← 整套速查表 GESP 六级 全部真题

题目

删除二叉排序树中的节点时,如果节点有两个孩子,则横线处应填入( ),其中 findMax 和 findMin 分别为寻找树的最大值和最小值的函数。

struct TreeNode {
    int val;
    TreeNode* left;
    TreeNode* right;
    TreeNode(int x): val(x), left(nullptr), right(nullptr) {}
};

TreeNode* deleteNode(TreeNode* root, int key) {
    if (!root) return nullptr;
    if (key < root->val) {
        root->left = deleteNode(root->left, key);
    }
    else if (key > root->val) {
        root->right = deleteNode(root->right, key);
    }
    else {
        if (!root->left) return root->right;
        if (!root->right) return root->left;
        TreeNode* temp = ___________;  // 在此处填写代码
        root->val = temp->val;
        root->right = deleteNode(root->right, temp->val);
    }
    return root;
}
答案:C

考点

函数与递归

解题思维

根据上下文和C++语法规则确定空缺处应填的内容,关注函数调用参数、表达式和返回值类型。

常见错误

填空时注意语法完整性:分号、括号匹配、函数参数类型和个数、返回值类型。

详细解析(节选)

【考点】二叉排序树删除|二叉树遍历|递归

定位 GESP 六级树形结构模块。命题人卡住的是"删除两子节点"时,学生常混淆"右子树最小"与"左子树最大"的替换方向,很多人会下意识选"右孩子"或"左孩子",本质是没理解 BST 删除的标准流程。

删两子节点必用中序后继(右子树最小)或前驱(左子树最大)替换。代码中root->right = deleteNode(root->right, temp->val)明确在右子树递归删除,替换值必须来自右子树。findMin专找子树中序最小,C 项精准匹配。

A 项root->left直接取左孩子,左子树可能仍含比新根大的节点,破坏 BST 序;B 项root->right同理,未剔除原右子树最左节点;D 项findMax(root->left)虽能得左子树最大节点,但替换后需从左子树删除,与代码"从右子树删"矛盾。最阴险陷阱是"右子树最小=右孩子",忽略右孩子可能有左子树。

若将代码改为root->left = deleteNode(root->left, temp->val),答案会变为 D。刷到此类题先问:替换后在哪边删?答案方向立刻锁定。

同考点真题

在 OI伴学 里做这道题
登录后可计时作答、查看完整六段式解析,并按你的错题自动生成同类练习。
去刷题先做一次 AI 学情诊断