代码随想录算法训练营第二十三天 | 669. 修剪二叉搜索树、 108.将有序数组转换为二叉搜索树、 538.把二叉搜索树转换为累加树

669. 修剪二叉搜索树

题目链接:669. 修剪二叉搜索树

给你二叉搜索树的根节点 root ,同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树,使得所有节点的值在[low, high]中。修剪树 不应该 改变保留在树中的元素的相对结构 (即,如果没有被移除,原有的父代子代关系都应当保留)。 可以证明,存在 唯一的答案

所以结果应当返回修剪好的二叉搜索树的新的根节点。注意,根节点可能会根据给定的边界发生改变。

文章讲解/视频讲解:https://programmercarl.com/0669.%E4%BF%AE%E5%89%AA%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91.html

思路

自己的实现方法有点稀里糊涂,调了几次bug后通过了。采用后序遍历,在每一次的递归遍历中,首先保存下已经处理过的左右子树。如果当前节点在 ] [ l o w , h i g h ] ][low, high] ][low,high]范围内,则返回当前节点,如果小于 l o w low low,则返回右子树,如果大于 h i g h high high,则返回左子树。

ps:题目好像不能让我们把修剪的节点delete掉,会报错。

C++实现

class Solution {
public:TreeNode* traversal(TreeNode* node, int low, int high){if(!node) return nullptr;TreeNode* left = trimBST(node->left, low, high);TreeNode* right = trimBST(node->right, low, high);if(node->val >= low && node->val <= high){node->left = left;node->right = right;return node;}else if(node->val < low){return right;}else{return left;}}TreeNode* trimBST(TreeNode* root, int low, int high) {TreeNode* result = traversal(root, low, high);return result;}
};

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

题目链接:108.将有序数组转换为二叉搜索树

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

高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。

文章讲解/视频讲解:https://programmercarl.com/0108.%E5%B0%86%E6%9C%89%E5%BA%8F%E6%95%B0%E7%BB%84%E8%BD%AC%E6%8D%A2%E4%B8%BA%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91.html

思路

采用递归的方法来实现。因为题目给的是排好序的数组,且要求是一棵高度平衡的二叉搜索树,所以在每次递归的时候,找出当前范围 [ l e f t , h i g h ] [left, high] [left,high]内的中位数 m i d mid mid,以该中位数作为当前子树的头节点,并递归地用 [ l e f t , m i d − 1 ] [left, mid-1] [left,mid1]范围内的数组建立左子树, [ m i d + 1 , r i g h t ] [mid + 1, right] [mid+1,right]范围内的数组建立右子树。

C++实现

class Solution {
public:TreeNode* traversal(const vector<int>& nums, int left, int right){if(left > right) return nullptr;int mid = left + (right - left) / 2;TreeNode* node = new TreeNode(nums[mid]);node->left = traversal(nums, left, mid - 1);node->right = traversal(nums, mid + 1, right);return node;}TreeNode* sortedArrayToBST(vector<int>& nums) {return traversal(nums, 0, nums.size() - 1);}
};

538.把二叉搜索树转换为累加树

题目链接:538.把二叉搜索树转换为累加树

给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。

提醒一下,二叉搜索树满足下列约束条件:

  • 节点的左子树仅包含键 小于 节点键的节点。
  • 节点的右子树仅包含键 大于 节点键的节点。
  • 左右子树也必须是二叉搜索树。

文章讲解/视频讲解:https://programmercarl.com/0538.%E6%8A%8A%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91%E8%BD%AC%E6%8D%A2%E4%B8%BA%E7%B4%AF%E5%8A%A0%E6%A0%91.html

思路

采用一种右中左的反向中序遍历,注意,这里与通常的左中右的遍历不同。在反向中序遍历的过程中,记录下前一个遍历到的节点pre,将当前节点node的值加上pre节点的值。

类似地,如果想要求这样的累加树:每个节点node的新值等于原树种小于或等于node.val的值之和,可以采用正向的中序遍历来解决。

C++实现

class Solution {
public:TreeNode* pre = nullptr;void traversal(TreeNode* node){if(!node) return;traversal(node->right);if(pre) node->val += pre->val;pre = node;traversal(node->left);}TreeNode* convertBST(TreeNode* root) {traversal(root);return root;}
};

小结

二叉树的部分终于刷完了,撒花~后面还需要仔细回顾一下。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/595658.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CAN通信-报文信号格式(Inter、Motorola)

DBC 1、Inter格式和Motorola格式2、制作DBC 1、Inter格式和Motorola格式 Inter格式(小端模式)&#xff1a;高位字节存放在高地址中&#xff0c;低位字节存放在低地址中&#xff0c;数据表现&#xff1a;以一个字节为例&#xff0c;前半个字节为地位。 Motorola格式(大端模式)&…

免费SSL证书安全吗?

在互联网时代&#xff0c;网络安全已经成为了每个网民关注的焦点。而SSL证书&#xff0c;作为保障网络安全的重要工具&#xff0c;也越来越受到人们的关注。然而&#xff0c;市面上的SSL证书价格不菲&#xff0c;让许多小站长望而却步。这时&#xff0c;免费的SSL证书就显得十分…

【XR806开发板试用】+00. Win11环境下安装docker环境

很幸运得到XR806开发板的试用机会&#xff0c;在此深深感谢主办方给菜鸟一个机会。 之前开发的芯片主要是STM32、GD32之类的芯片&#xff0c;都是基于win环境的集成环境。现在拿到这块开发板感觉无从下手&#xff0c;就从安装docker环境开始&#xff0c;慢慢更新xr806的开发之…

开启新篇章!迅软科技牵手行业巨擘,引爆开门红!

新年甫至 迅软科技迎来喜气洋洋开门红 成功携手上海钊晟、成都邦飞科技等业界翘楚 为我们2024年决战注入了强劲动力 凝心聚力跃龙门&#xff0c;携手奋进开门红&#xff01; 钊晟公司与迅软科技携手 共同构筑数据安全防护平台 上海钊晟传感技术有限公司是一家致力于传感…

数据库攻防学习

免责声明 本文仅供学习和研究使用,请勿使用文中的技术用于非法用途,任何人造成的任何负面影响,与本号及作者无关。 Redis 0x01 redis学习 在渗透测试面试或者网络安全面试中可能会常问redis未授权等一些知识&#xff0c;那么什么是redis&#xff1f;redis就是个数据库&#xff…

UI5与后端的文件交互(三)

文章目录 前言一、开发Action1. 修改Table2. BDEF中新增Action3. 新建结构&#xff0c;用于接收uuid以及附件数据4. 实现Method逻辑 二、UI5项目修改1. 添加表格行2. 事件处理函数3. 点击文件名时的事件 三、测试 前言 这系列文章详细记录在Fiori应用中如何在前端和后端之间使…

【LMM 008】Instruction Tuning with GPT-4

论文标题&#xff1a;Instruction Tuning with GPT-4 论文作者&#xff1a;Baolin Peng, Chunyuan Li, Pengcheng He, Michel Galley, Jianfeng Gao 作者单位&#xff1a;Microsoft Research 论文原文&#xff1a;https://arxiv.org/abs/2304.03277 论文出处&#xff1a;– 论文…

stable diffusion 人物高级提示词(一)头部篇

一、女生发型 prompt描述推荐用法Long hair长发一定不要和 high ponytail 一同使用Short hair短发-Curly hair卷发-Straight hair直发-Ponytail马尾high ponytail 高马尾&#xff0c;一定不要和 long hair一起使用&#xff0c;会冲突Pigtails2条辫子-Braid辫子只写braid也会生…

Redis 持久化—RDB

文章目录 1. 为什么需要Redis持久化&#xff1f;2. Redis持久化的几种方式3. RDB简介4. 持久化触发4.1 手动触发4.1.1 save命令4.1.2 bgsave 命令 4.2 自动触发4.2.1 save m n4.2.2 flushall4.2.3 主从同步触发 5. 配置说明6. 配置配置7. 配置配置8. RDB 文件恢复9. RDB 优缺点…

擎创动态 | 某城商行案例入选信通院 GOLF+年度明星解决方案

2023年12月15日&#xff0c;“2023GOLF IT新治理领导力论坛”在京召开&#xff0c;该论坛由中国信息通信研究院、中国通信标准化协会主办。在此次论坛中&#xff0c;主办方正式发布了XOps领域年度评选结果。擎创科技“一体化智能根因定位解决方案”凭借优秀的落地实践成果&…

机器学习--主成分分析 PCA

特征维度约减 特征约减的目的是将高维特征向量映射到低维子空间中。比如&#xff1a; 给定n个样本&#xff08;每个样本维度为p维&#xff09;{x1,....xn} 通过特征变换/投影矩阵实现特征空间的压缩: 高维数据 为何要维度约减? 数据压缩和存储&#xff1a;高维数据通常需要占用…

No Magic—复杂机电产品系统架构开发套件

产品概述 CATIA Magic&#xff0c;原名MagicDraw&#xff0c;俗称No Magic&#xff0c;被达索收购后融入3DExperience产品协同研发管理平台中&#xff0c;形成更具协同体验的系统工程解决方案。该软件提供对SysML/UML/UAF语言的完整支持&#xff0c;提供独有的MagicGrid方法论&…

易点易动固定资产管理系统集成企业微信,帮助企业全生命周期管理固定资产

在现代企业中&#xff0c;固定资产管理是一项至关重要的任务。固定资产的高效管理可以提高企业的运营效率、降低成本&#xff0c;并确保资产的安全和稳定。然而&#xff0c;传统的固定资产管理方法往往复杂繁琐&#xff0c;容易出现信息不准确、流程不畅和数据不一致的问题。为…

设计模式:简单工厂模式

这里写目录标题 工厂模式简介核心角色&#xff1a;实现 工厂模式 工厂模式&#xff08;Factory Pattern&#xff09;是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式&#xff0c;它提供了一种创建对象的最佳方式。 工厂模式提供了一种将对象的实例化过程封…

d3dcompiler_43.dll丢失怎么修复?怎么解决

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“找不到d3dcompiler_43.dll文件”。那么&#xff0c;d3dcompiler_43.dll是什么文件&#xff1f;它的作用是什么&#xff1f;如果缺失了该如何修复呢&#xff1f;本文将详细介绍d3dcompiler_…

[python]项目怎么使用第三方库

要在Python项目中使用第三方库&#xff0c;可以按照以下步骤进行&#xff1a; 安装第三方库&#xff1a;使用pip命令安装要使用的第三方库。例如&#xff0c;要安装requests库&#xff0c;可以运行以下命令&#xff1a; pip install requests导入库文件&#xff1a;在Python项…

RK3568驱动指南|第九篇 设备模型-第102章 platform总线注册流程实例分析实验

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工艺&#xff0c;搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码&#xff0c;支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU&#xff0c;可用于轻量级人工…

C# halcon 工业产品尺寸测量

产品检测 这段代码是一个基于HalconDotNet的Windows窗体应用程序&#xff0c;主要用于图像处理和测量。以下是对代码的一些总结&#xff1a; 1. **图像显示与加载&#xff1a;** - 使用HalconDotNet库进行图像处理。 - 通过OpenFileDialog实现图像文件的选择和加载。 …

如何解决企业在绩效管理过程中目标设定不清晰的问题?

目标清晰对于企业至关重要&#xff0c;它能够为企业和员工提供明确的方向&#xff0c;提高工作效率&#xff0c;增强团队合作&#xff0c;为绩效评估提供客观依据&#xff0c;并促进持续改进。确保目标的清晰和具体是实现有效绩效管理的基础&#xff0c;有助于推动企业的整体发…

纯css实现三等分饼图

实现原理&#xff0c;先绘制一个圆&#xff0c;然后把圆分成两份&#xff0c;在绘制一个菱形&#xff0c;最下面的角是120&#xff0c;这样就可以实现三等分啦 关键代码是一个css很少见的属性clip-path clip-path: polygon(24rem 36rem, 48rem 18rem, 24rem 0, 0 18rem); &…