问题描述:
- 给定二叉搜索树的根节点
root
、最小边界 low
和最大边界 high
。 - 通过修剪二叉搜索树,使得所有节点的值在
[low, high]
中。
- 修剪树不应该改变保留在树中的元素的相对结构 (即,如果没有被移除,原有的父代子代关系都应当保留)。
- 可以证明,存在唯一的答案。
- 所以结果应当返回修剪好的二叉搜索树的新的根节点。
- 注意,根节点可能会根据给定的边界发生改变。
核心思路:
- 该题其实比较直观,dfs 解法即可。
- 在当前遍历中,要进行下述操作:
- 假若当前节点的值小于
low
,则将右子树的递归结果返回;假若当前节点的值大于 high
,则将左子树的递归结果返回。【相当于区间外的节点需要把当前节点以及某一子树修剪掉】 - 假若当前结点的值位于区间
[low, high]
之间,则正常递归进入左右子并返回结果作为当前节点的左右子即可。
代码实现:
class Solution
{
public:
TreeNode* trimBST(TreeNode* root, int low, int high)
{
if(!root) return root;
if(root->val < low) return trimBST(root->right, low, high);
if(root->val > high) return trimBST(root->left, low, high);
root->left = trimBST(root->left, low, high);
root->right = trimBST(root->right, low, high);
return root;
}
};