首页 > 其他分享 >代码随想录Day21

代码随想录Day21

时间:2024-08-20 21:49:14浏览次数:15  
标签:right 随想录 代码 Day21 high low root 节点 left

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]

提示:

树中节点数在范围 [1, 104] 内
0 <= Node.val <= 104
树中每个节点的值都是 唯一 的
题目数据保证输入是一棵有效的二叉搜索树
0 <= low <= high <= 104


正解

  1. 确定终止条件
    修剪的操作并不是在终止条件上进行的,所以就是遇到空节点返回就可以了。
  2. 确定单层递归的逻辑
    如果root(当前节点)的元素小于low的数值,那么应该递归右子树,并返回右子树符合条件的头结点。
    如果root(当前节点)的元素大于high的,那么应该递归左子树,并返回左子树符合条件的头结点。
    接下来要将下一层处理完左子树的结果赋给root->left,处理完右子树的结果赋给root->right。
  3. 最后返回root节点
上代码(●'◡'●)
class Solution {
public:
    TreeNode* trimBST(TreeNode* root, int low, int high) {
        if (root == nullptr ) return nullptr;
        if (root->val < low) {
            TreeNode* right = trimBST(root->right, low, high); // 寻找符合区间[low, high]的节点
            return right;
        }
        if (root->val > high) {
            TreeNode* left = trimBST(root->left, low, high); // 寻找符合区间[low, high]的节点
            return left;
        }
        root->left = trimBST(root->left, low, high); // root->left接入符合条件的左孩子
        root->right = trimBST(root->right, low, high); // root->right接入符合条件的右孩子
        return root;
    }
};

精简:

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

108.将有序数组转换为二叉搜索树

给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵
平衡二叉搜索树。

示例 1:

输入:nums = [-10,-3,0,5,9]
输出:[0,-3,9,-10,null,5]
解释:[0,-10,5,null,-3,null,9] 也将被视为正确答案:

示例 2:

输入:nums = [1,3]
输出:[3,1]
解释:[1,null,3] 和 [3,1] 都是高度平衡二叉搜索树。

提示:

1 <= nums.length <= 104
-104 <= nums[i] <= 104
nums 按 严格递增 顺序排列


正解

其实数组构造二叉树,构成平衡树是自然而然的事情;
因为大家默认都是从数组中间位置取值作为节点元素,一般不会随机取。
所以想构成不平衡的二叉树是自找麻烦。
本质就是寻找分割点,分割点作为当前节点,然后递归左区间和右区间。
分割点就是数组中间位置的节点。
那么为问题来了,如果数组长度为偶数,中间节点有两个,取哪一个?
取哪一个都可以,只不过构成了不同的平衡二叉搜索树。

  1. 确定递归函数返回值及其参数
    删除二叉树节点,增加二叉树节点,都是用递归函数的返回值来完成,这样是比较方便的。
    那么本题要构造二叉树,依然用递归函数的返回值来构造中节点的左右孩子。
    再来看参数,首先是传入数组,然后就是左下标left和右下标right
    在构造二叉树的时候尽量不要重新定义左右区间数组,而是用下标来操作原数组。
  2. 确定递归终止条件
    这里定义的是左闭右闭的区间,所以当区间 left > right的时候,就是空节点了。
  3. 确定单层递归的逻辑
    首先取数组中间元素的位置,不难写出int mid = (left + right) / 2;
    这么写其实有一个问题,就是数值越界,例如left和right都是最大int,这么操作就越界了
    所以可以这么写:int mid = left + ((right - left) / 2);
    取了中间位置,就开始以中间位置的元素构造节点,代码:TreeNode* root = new TreeNode(nums[mid]);。
    接着划分区间,root的左孩子接住下一层左区间的构造节点,右孩子接住下一层右区间构造的节点。
    最后返回root
上代码(●'◡'●)
class Solution {
private:
    TreeNode* traversal(vector<int>& nums, int left, int right) {
        if (left > right) return nullptr;
        int mid = left + ((right - left) / 2);
        TreeNode* root = new TreeNode(nums[mid]);
        root->left = traversal(nums, left, mid - 1);
        root->right = traversal(nums, mid + 1, right);
        return root;
    }
public:
    TreeNode* sortedArrayToBST(vector<int>& nums) {
        TreeNode* root = traversal(nums, 0, nums.size() - 1);
        return root;
    }
};

标签:right,随想录,代码,Day21,high,low,root,节点,left
From: https://www.cnblogs.com/Murder-sans/p/18370393/dmsxl_Day21

相关文章

  • 线程(Thread)的使用方法和锁(同步代码块,lock锁)的问题
    多线程:    进程:      正在运行的程序,是系统进行资源分配和调用的独立单位。      每一个进程都有它自己的内存空间和系统资源。      理解:一个正在运行的软件    线程:      是进程中的单个顺序控制流,是......
  • Swift代码重构:提升代码质量的魔法工具
    标题:Swift代码重构:提升代码质量的魔法工具Swift是一种用于iOS、macOS、watchOS和tvOS应用开发的强类型、编译型编程语言。随着应用的迭代和功能的增加,代码的维护和扩展变得越来越复杂。Swift的代码重构工具可以帮助开发者改进现有代码的设计而不改变其外部行为,从而提高代码......
  • py2puml 是一个用于将 Python 代码转换为 PlantUML 图的工具,python代码生成py2puml案
    py2puml 是一个用于将Python代码转换为PlantUML图的工具,但它可能不是广泛认知或广泛使用的库,因为存在多个类似名称的工具和库,且它们的功能和用法可能有所不同。不过,基于你的需求,我将提供一个假设性的例子,说明如何使用一个假想的 py2puml 库来生成Python代码的UML图。......
  • Python、R用RFM模型、机器学习对在线教育用户行为可视化分析|附数据、代码
    全文链接:https://tecdat.cn/?p=37409原文出处:拓端数据部落公众号分析师:ChunniWu随着互联网的不断发展,各领域公司都在拓展互联网获客渠道,为新型互联网产品吸引新鲜活跃用户,刺激用户提高购买力,从而进一步促进企业提升综合实力和品牌影响力。然而,为了更好地了解产品的主要受众群......
  • 【图像特效系列】图像浮雕特效的实践 | 包含代码和效果图
    目录一图像浮雕特效1代码2效果图图像特效系列主要是对输入的图像进行处理,生成指定特效效果的图片。图像素描特效会将图像的边界都凸显出来;图像怀旧特效是指图像经历岁月的昏暗效果;图像光照特效是指图像存在一个类似于灯光的光晕特效,图像像素值围绕光照中心点呈圆形范......
  • Swift编译器代码生成策略全解析:优化你的性能与效率
    标题:Swift编译器代码生成策略全解析:优化你的性能与效率在Swift编程的高性能世界里,编译器的代码生成选项扮演着至关重要的角色。它们不仅影响应用的性能,还决定了最终代码的效率和大小。本文将深入探讨Swift编译器提供的代码生成选项,并通过实际代码示例,指导你如何利用这些选......
  • Swift文档生成工具全攻略:从代码到文档的自动化之旅
    标题:Swift文档生成工具全攻略:从代码到文档的自动化之旅在Swift开发的世界中,代码的清晰表达与高效维护同等重要。Swift的代码文档生成工具,如同一盏明灯,照亮了代码的内在逻辑,让其他开发者或未来的你能够快速理解和使用你的代码。本文将带你深入了解如何在Swift中使用文档生成......
  • 织梦模板引擎的代码样式有如下几种形式
    1、织梦模板引擎的代码样式有如下几种形式:{dede:标记名称属性='值'/} {dede:标记名称属性='值'}{/dede:标记名称}{dede:标记名称属性='值'}自定义样式模板(InnerText){/dede:标记名称}提示:如果使用带底层模板的标记,必须严格用{dede:标记名称属性='值'}{/ded......
  • iPaaS丨API低代码平台适用的业务场景
    API低代码开发平台在数字化转型加速的当下,API低代码开发平台作为技术创新的前沿阵地,正逐步成为企业构建高效、灵活IT架构的关键支撑。该平台不仅继承了微服务架构的诸多优点,如高内聚、低耦合,还深度融合了低代码开发理念,为开发团队提供了前所未有的便捷与高效。平台通过数据模型......
  • 通义灵码代码搜索功能的前沿性研究论文被软件工程国际顶会 FSE 录用
    在今年FSE2024软件工程大会上,阿里云通义灵码团队和重庆大学合作的论文《AnEmpiricalStudyofCodeSearchinIntelligentCodingAssistant:Perceptions,Expectations,andDirections》被FSEIndustry2024(CCFA)录用。本篇论文主要探讨了在智能编码助手中的代码......