669. 修剪二叉搜索树
几乎所有的二叉树问题都可以采用递归的方式(也可以来理解为深度优先算法)化解为子问题来求解,一旦有这种化成子问题的想法,问题就会变的很简单了。递归就得靠宏观逻辑,抠细节,哼哼,你就输了
给你二叉搜索树的根节点 root ,同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树,使得所有节点的值在[low, high]中。修剪树不应该改变保留在树中的元素的相对结构(即,如果没有被移除,原有的父代子代关系都应当保留)。 可以证明,存在唯一的答案。
所以结果应当返回修剪好的二叉搜索树的新的根节点。注意,根节点可能会根据给定的边界发生改变。
示例 1:
输入:root = [1,0,2], low = 1, high = 2
输出:[1,null,2]
示例 2:
输入:root = [3,0,4,null,2,null,null,1], low = 1, high = 3
输出:[3,2,null,1]
示例 3:
输入:root = [1], low = 1, high = 2
输出:[1]
示例 4:
输入:root = [1,null,2], low = 1, high = 3
输出:[1,null,2]
示例 5:
输入:root = [1,null,2], low = 2, high = 4
输出:[2]
提示:
树中节点数在范围 [1, 104] 内
0 <= Node.val <= 104
树中每个节点的值都是唯一的
题目数据保证输入是一棵有效的二叉搜索树
0 <= low <= high <= 104
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/trim-a-binary-search-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
方法1:非递归解法
class Solution {
public:
TreeNode* trimBST(TreeNode* root, int low, int high) {
while(root!=nullptr && (root->val < low ||root->val > high))
{
while(root!=nullptr && root->val < low)
{
root = root->right;
}
while(root!=nullptr && root->val > high)
{
root=root->left;
}
if(root == nullptr)
{
return nullptr;
}
}
TreeNode* leftHead = root;
TreeNode* preNode = nullptr;
//trim low
while(leftHead!=nullptr)
{
while(leftHead!=nullptr && leftHead->val >= low)
{
preNode = leftHead;
leftHead = leftHead->left;
}
if(leftHead==nullptr)
{
break;
}
leftHead = leftHead->right;
while(leftHead != nullptr&& leftHead->val < low)
{
leftHead = leftHead->right;
}
if(nullptr != preNode)
{
preNode->left = leftHead;
}
}
//trim high
TreeNode* rightHead = root;
while(rightHead!=nullptr)
{
while(rightHead!=nullptr && rightHead->val <= high)
{
preNode = rightHead;
rightHead = rightHead->right;
}
if(rightHead == nullptr)
{
break;
}
rightHead = rightHead->left;
while(rightHead!=nullptr && rightHead->val >high)
{
rightHead = rightHead->left;
}
if(preNode != nullptr)
{
preNode->right = rightHead;
}
}
return root;
}
};
方法2:
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;
}
};

浙公网安备 33010602011771号