删除二叉排序树中的节点时,如果节点有两个孩子,则横线处应填入( ),其中 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++语法规则确定空缺处应填的内容,关注函数调用参数、表达式和返回值类型。
填空时注意语法完整性:分号、括号匹配、函数参数类型和个数、返回值类型。
【考点】二叉排序树删除|二叉树遍历|递归
定位 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。刷到此类题先问:替换后在哪边删?答案方向立刻锁定。