669. 修剪二叉搜索树
题目描述
给定一个二叉搜索树,同时给定最小边界L 和最大边界 R。通过修剪二叉搜索树,使得所有节点的值在[L, R]中 (R>=L) 。你可能需要改变树的根节点,所以结果应当返回修剪好的二叉搜索树的新的根节点。
示例 1:
示例 2:
思路
当node.val > R,那么用当前节点node的左子节点代替当前节点(因为左子节点比当前节点小)
类似地,当node.val < L,那么用当前节点node的右子节点代替当前节点(因为右子节点比当前节点大)
代码
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* trimBST(TreeNode* root, int L, int R) {
if(root == NULL){
return root;
}
if(root->val < L){
return trimBST(root->right,L,R);
}
if(root->val > R){
return trimBST(root->left,L,R);
}
root->left = trimBST(root->left,L,R);
root->right = trimBST(root->right,L,R);
return root;
}
};
复杂度分析
时间复杂度:O(N),其中 N 是给定的树的全部节点。我们最多访问每个节点一次。
空间复杂度:O(N),即使我们没有明确使用任何额外的内存,在最糟糕的情况下,我们递归调用的栈可能与节点数一样大。