zoukankan      html  css  js  c++  java
  • 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;
    
        }
    };
    

      

  • 相关阅读:
    URAL 2046 A
    URAL 2056 Scholarship 水题
    Codeforces Gym 100286I iSharp 水题
    Codeforces Gym H. Hell on the Markets 贪心
    Codeforces Gym 100286G Giant Screen 水题
    Codeforces Gym 100286B Blind Walk DFS
    Codeforces Gym 100286F Problem F. Fibonacci System 数位DP
    Codeforces Gym 100286A. Aerodynamics 计算几何 求二维凸包面积
    Codeforces Gym 100418K Cards 暴力打表
    Codeforces Gym 100418J Lucky tickets 数位DP
  • 原文地址:https://www.cnblogs.com/qiaozhoulin/p/15172830.html
Copyright © 2011-2022 走看看