总结:这道题还是有一定难度的,自己最初想的暴力方法是先遍历一遍搜索树,得到一个vector容器,再遍历容器,当出现在范围外的点时,使用外置函数将此节点删除,比较麻烦。
递归解法:当出现在范围外的节点时,用两个节点各自接住左右两边在范围内的节点再返回这两个节点,从而达到删除当前节点的效果。
代码如下:
if(root->val < low)
{
TreeNode* right = trimBST(root->right,low,high);
return right;
}
if(root->val > high)
{
TreeNode* left = trimBST(root->left,low,high);
return left;
}
接着,再用当前层节点root接住返回回来的左右节点,最终达到删除效果,接着返回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);
return right;
}
if(root->val > high)
{
TreeNode* left = trimBST(root->left,low,high);
return left;
}
root->left = trimBST(root->left,low,high);
root->right = trimBST(root->right,low,high);
return root;
}
};