- 描述:Given a binary search tree and the lowest and highest boundaries as L and R, trim the tree so that all its elements lies in [L, R] (R >= L). You might need to change the root of the tree, so the result should return the new root of the trimmed binary search tree.
Example 1:
Input:
1 / \ 0 2
L = 1
R = 2
Output:1 \ 2
Example 2:
Input:
3 / \ 0 4 \ 2 / 1
L = 1
R = 3
Output:3 / 2 / 1
分析:给定一棵二叉搜索树和其最小和最大边界,修建这棵树,找到位于L和R之间的元素。
思路一:首先要明确的一点是这棵数为二叉搜索树,根据二叉搜索数的特点,left.key<parent.key<=right.key,递归求解,分为以下几种情况:
1.节点为空(return NULL)
2.节点值小于最低边界L,则节点整个左子树的值都小于L,因此舍弃左子数。
3.节点值大于最大边界R,则节点整个右子树的值都大于R,因此舍弃右子树
4.否则继续寻找。
class Solution {
public:
TreeNode* trimBST(TreeNode* root, int L, int R) {
if (!root) return NULL;
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;
}
};