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;

    }
};

  

 

posted @ 2021-08-22 17:12  linqiaozhou  阅读(38)  评论(0编辑  收藏  举报