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;
    
        }
    };
    

      

  • 相关阅读:
    碰到了一个GDI+的问题,郁闷ing。。。
    (旧文重贴)对于以前遇到过的ws proxy实例化时间太长的问题,看JNDI受到了些启发
    (旧文重贴)下午又看了MBF的介绍,靠,心丧如死!
    (旧文重贴)前段时间关于SmartClient部署的两个问题,都搞定了。
    (旧文重贴)编程高手箴言读书笔记(1)
    SAP MDM 学习网址
    常用Oralce sql
    WE02 修改IDOC
    OBD/IBD 的拣配数量更新
    配置ALE仓库管理
  • 原文地址:https://www.cnblogs.com/qiaozhoulin/p/15172830.html
Copyright © 2011-2022 走看看