本题存在误区,若当前节点的值大于最大值或小于最小值,直接对当前节点进行删除操作是错误的(第一次错误点),要分为两种情况:
(1)节点值大于最大值,继续对节点的左子树进行递归,并将节点的左子树返回
(2)节点值小于最小值,继续对节点的右子树进行递归,并将节点的右子树返回
同时,不需对节点值等于最大或最小值进行额外操作,继续递归即可(我的思想误区)
递归法:
(1)确定参数和返回值
参数为当前节点,最小值,最大值,返回值为节点
(2)确定终止条件
当节点为空时,返回空指针
(3)确定单步逻辑
节点值大于最大值时,对节点左子树进行递归,返回节点左子树;当节点值小于最小值时,对节点右子树进行递归,返回节点右子树;若无,则对节点的左右子树进行递归,返回root
代码如下:
class Solution {
public:
TreeNode* trimBST(TreeNode* root, int low, int high) {
if (root == nullptr ) return nullptr;
if (root->val < low) {
TreeNode* right = trimBST(root->right, low, high); // 寻找符合区间[low, high]的节点
return right;
}
if (root->val > high) {
TreeNode* left = trimBST(root->left, low, high); // 寻找符合区间[low, high]的节点
return left;
}
root->left = trimBST(root->left, low, high); // root->left接入符合条件的左孩子
root->right = trimBST(root->right, low, high); // root->right接入符合条件的右孩子
return root;
}
};