class Solution {
public:
TreeNode* trimBST(TreeNode* root, int low, int high) {
if (root == nullptr) return nullptr;
if (root->val < low) { //确定root
TreeNode* right = trimBST(root->right, low, high);
return right;
}
if (root->val > high) { //确定root
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;
}
};
时间复杂度O(n)
思路:递归法还是有一点绕,整体步骤就是先确定好根节点,根节点如果有问题会出现两种情况,一是小于low,此时我们应该从根节点的右儿子中继续寻找合适的根节点,以为一旦根节点小于low,其左子树一定都小于low,第二种情况是大于high,同理,我们应该从其右儿子中去寻找,找好根节点后,然后再去确定其左儿子和右儿子,确定的方法与BST的增添和删除有异曲同工之妙,只是不需要有if条件的限制,因为现在是有方向性的遍历整颗树,而不是有方向性的遍历某一条边。