代码随想录 二叉树:669. 二叉搜索树的修剪
题目描述
给你二叉搜索树的根节点 root
,同时给定最小边界low
和最大边界 high
。通过修剪二叉搜索树,使得所有节点的值在[low, high]
中。修剪树 不应该 改变保留在树中的元素的相对结构 (即,如果没有被移除,原有的父代子代关系都应当保留)。 可以证明,存在 唯一的答案 。
所以结果应当返回修剪好的二叉搜索树的新的根节点。注意,根节点可能会根据给定的边界发生改变。
题目链接:450
文章讲解:450
思考
题目要求给定根节点和边界,返回修剪后的根节点。
那么对于任意一棵树,若根节点小于左边界,则应该剪去左子树,继续修剪该节点的右子树。若根节点大于左边界,应该剪去右子树,继续修剪左子树。若根节点在边界之中,应该修剪左右两颗子树。
经历三种情况之后,修剪后的树就是满足要求的树
递归三部曲
1、确定递归函数返回值和参数
给定根节点和边界,返回修剪后的树的根节点
2、终止条件
空树修剪后还是空树
3、单层递归逻辑
- 若根节点小于左边界,则应该剪去左子树,继续修剪该节点的右子树。返回修剪后的右子树
- 若根节点大于左边界,应该剪去右子树,继续修剪左子树,返回修剪后的左子树。
- 若根节点在边界之中,应该修剪左右两颗子树,返回修剪后的根节点的树。
代码实现
C++
class Solution {
public:
TreeNode* trimBST(TreeNode* root, int low, int high) {
if(root == nullptr) return nullptr;
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;
}
};