代码随想录day20--二叉树的应用8

LeetCode669.修剪二叉搜索树

题目描述:

给你二叉搜索树的根节点 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]

解题思路:

·思路其实和上一篇中的删除节点是类似的,只是需要将二叉树全部遍历

·并且需要考虑题目给定的区间,删除掉区间外的元素后,再将元素与其父节点连接

·需要利用好二叉搜索树的特性,若一个节点的值小于区间内的最小值,则其节点的左树上全部不符合条件,可以直接删除,同理,若一个节点的值大于区间内的最大值,则其节点的右树上全部不符合条件,亦可以直接删除。

代码如下:

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);return right;}if(root->val > high){//删除右树中不符合的元素TreeNode* left = trimBST(root->left,low,high);return left;}root->left = trimBST(root->left,low,high);//遍历符合条件的左孩子root->right = trimBST(root->right,low,high);//遍历符合条件的右孩子return root;}
};

易错点:

·依旧是二叉树中的重构,如果看代码看不懂,可以尝试画图进行尝试

总结:这道题其实不难,但是理解起来可能会有些费劲,需要对递归的理解有比较深刻的认识

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

题目描述:

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

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

示例 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] 都是高度平衡二叉搜索树。

解题思路:
·找到数组的中元素值,再进行二叉搜索树的排序,即可解答

·需要注意的是,我们需要构建一个平衡二叉树,否则题目就毫无意义了

·不需要先确定根节点,再从头进行遍历构建二叉树,只需要确定了中间节点,再向左和向右遍历,即可很快的求解出

代码如下:

class Solution {
public: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;}TreeNode* sortedArrayToBST(vector<int>& nums) {TreeNode* root = traversal(nums,0,nums.size()-1);return root;}
};

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

题目描述:

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

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

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

示例 1:

输入:[4,1,6,0,2,5,7,null,null,null,3,null,null,null,8]
输出:[30,36,21,36,35,26,15,null,null,null,33,null,null,null,8]

示例 2:

输入:root = [0,null,1]
输出:[1,null,1]

示例 3:

输入:root = [1,0,2]
输出:[3,3,2]

示例 4:

输入:root = [3,2,4,1]
输出:[7,9,4,10]

解题思路:
·需要明白题目中所说的累加树的定义,是从右子树中的节点开始向上累加,也就是使用右中左的方式进行遍历累加。

·得出右中左的遍历方式后,我们即可得知,与中序遍历相关,也就是使用反中序遍历进行解题

代码如下:

class Solution {
public:int pre = 0;void traversal(TreeNode* cur){if(cur == NULL) return ;traversal(cur->right);cur->val += pre;pre = cur->val;traversal(cur->left);}TreeNode* convertBST(TreeNode* root) {pre = 0;traversal(root);return root;}
};

总结:经过这么久的二叉树基本应用的练习,今天的题目的难度以及逻辑理解起来并不会很困难,二叉树的基本应用环节到此也就告一段落了。

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

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

相关文章

【ES】--Elasticsearch的分词器深度研究

目录 一、问题描述及分析二、analyze分析器原理三、 multi-fields字段支持多场景搜索(如同时简繁体、拼音等)1、ts_match_analyzer配置分词2、ts_match_all_analyzer配置分词3、ts_match_1_analyzer配置分词4、ts_match_2_analyzer配置分词5、ts_match_3_analyzer配置分词6、ts…

ctfshow-文件上传(web151-web161)

目录 web151 web152 web153 web154 web155 web156 web157 web158 web159 web160 web161 web151 提示前台验证不可靠 那限制条件估计就是在前端设置的 上传php小马后 弹出了窗口说不支持的格式 查看源码 这一条很关键 这种不懂直接ai搜 意思就是限制了上传类型 允许…

Ubuntu Desktop - Files Preferences

Ubuntu Desktop - Files Preferences 1. Behavior2. ViewsReferences 1. Behavior Go to file browser’s Menu -> Edit -> Preferences -> Behavior 2. Views Go to file browser’s Menu -> Edit -> Preferences -> Views ​​​ References [1] Yong…

掘根宝典之C++运算符重载

什么是运算符重载 运算符重载是一种形式的C多态。这很容易让大家想到函数多态&#xff0c;让我们使用同名的函数来完成相同的基本操作&#xff0c;即使是用于不同的类型&#xff0c;不懂函数多态的看这里http://t.csdnimg.cn/ipbqR 运算符重载把重载的概念拓展到运算符上&…

EMC学习笔记(二十五)降低EMI的PCB设计指南(五)

线缆和连接器 1 差模和共模噪声2 串扰3 返回路径数量4 外部PCB -IO 布局建议5 防止噪音和静电放电 tips&#xff1a;资料主要来自网络&#xff0c;仅供学习使用。 设计良好的两层板&#xff0c;和大多数四层板&#xff0c;有最小的辐射。系统级的问题是由于将PCB与任何板外支持…

vector容器

1. vector基本概念 1.1 功能&#xff1a; vector数据结构和数组非常相似&#xff0c;也称为单端数组 vector与普通数组区别&#xff1a; 不同之处在于数组是静态空间&#xff0c;而vector可以动态扩展 动态扩展&#xff1a; 并不是在原空间之后续接新空间&#xff0c;而是找更…

视频讲解:优化柱状图

你好&#xff0c;我是郭震 AI数据可视化 第三集&#xff1a;美化柱状图&#xff0c;完整视频如下所示&#xff1a; 美化后效果前后对比&#xff0c;前&#xff1a; 后&#xff1a; 附完整案例源码&#xff1a; util.py文件 import platformdef get_os():os_name platform.syst…

方舟基金:若美机构按最大夏普率配置比特币,则有望将其推升至230-250万美元...

号外&#xff1a;教链内参2.12《方舟基金重磅报告〈大胆想象2024〉全文pdf》 方舟基金&#xff08;Ark Invest&#xff09;的木头姐&#xff08;Cathie Wood&#xff09;是业内的老熟人了。她一向以大胆的预测而著称。比如就在2023年10月份&#xff0c;木头姐在采访中就曾直言&…

​​​​​​​C#系列-C#EF框架的优缺点+针对大数据处理的优化(19)

C#EF框架的优缺点 C# EF&#xff08;Entity Framework&#xff09;框架的优缺点如下&#xff1a; 优点&#xff1a; 简单易用&#xff1a;EF框架提供了丰富的API和工具&#xff0c;使得开发者可以轻松地实现数据库的增删改查等操作&#xff0c;无需编写繁琐的SQL语句。对象化…

MIT-BEVFusion系列七--量化2_Camera、Fuser、Decoder网络的量化

目录 Camera 量化Camera Backbone (Resnet50) 量化替换量化层&#xff0c;增加residual_quantizer&#xff0c;修改bottleneck的前向对 Add 操作进行量化 Camera Neck (GeneralizedLSSFPN) 量化将 Conv2d 模块替换为 QuantConv2d 模块Camera Neck 中添加对拼接操作的量化替换 C…

STM32自学☞对射式红外传感器计数

infrared_count.c文件 /* 编写步骤 一、初始化函数 1.开启GPIO、AFIO时钟 (NVIC和EXIT不需要开启&#xff0c;因为EXIT时钟一直处于开启状态&#xff0c;而NVIC是内核里的外设和CPU处在一起且RCC管理的是内核外的外设&#xff0c;综上所述&#xff0c;所以不用开启) 2.配…

【机器学习】卷积和反向传播

一、说明 自从 AlexNet 在 2012 年赢得 ImageNet 竞赛以来&#xff0c;卷积神经网络 (CNN) 就变得无处不在。从不起眼的 LeNet 到 ResNets 再到 DenseNets&#xff0c;CNN 无处不在。 您是否想知道 CNN 的反向传播中会发生什么&#xff0c;特别是反向传播在 CNN 中的工作原理。…

Stream流学习笔记

Stream流 创建流中间操作1、filter2、map3、distinct4、sorted5、limit6、skip7、flatMap 终结操作1、forEach2、count3、max&min4、collect5、查找与匹配 创建流 单例集合&#xff1a;集合对象.stream() List<Integer> list new ArrayList<>(); Stream<…

uniapp禁止截屏录屏/投屏功能(adb投放失效)

经过测试代码写在App.vue会失效,请写在符合逻辑的界面 uni-app 实现安卓防截屏 在uniapp中实现 要在App中全局禁止截屏&#xff0c;那么可以在App.vue中调用 如果想要某个页面防截屏就在某个页面调用&#xff0c;但是在离开这个页面的时候要恢复截屏&#xff0c;否则全局…

C语言:详解操作符(下)

上一篇链接&#xff1a;C语言&#xff1a;详解操作符&#xff08;上&#xff09;摘要&#xff1a; 在上篇文章中&#xff0c;我们已经讲过位操作符等涉及二进制的操作符&#xff0c;这些有助于帮助我们后期理解数据如何在计算机中运算并存储&#xff0c;接下来本篇将更多的讲述…

OpenCV学习路线图

下面是针对初学者设计的一个学习路线图&#xff1a; 第1周&#xff1a;计算机视觉和OpenCV概述 介绍计算机视觉及其应用领域讨论OpenCV的历史、特点和工作原理OpenCV的安装和配置&#xff08;Windows/Linux/macOS&#xff09;了解OpenCV的基本数据结构&#xff08;cv::Mat等&…

如何清理Docker占用的磁盘空间?

在Docker中&#xff0c;随着时间的推移&#xff0c;占用的磁盘空间可能会不断增加。为了保持系统的稳定性和性能&#xff0c;定期清理Docker占用的磁盘空间非常重要。下面将介绍一些清理Docker磁盘空间的方法。 一、清理无用的容器 有时候&#xff0c;我们可能会运行一些临时…

mac docker 宿主机和容器间网络打通

动因 是这样&#xff0c;笔者最近满怀欣喜入手Docker&#xff0c;看着各种文章命令都是不断点头称道&#xff1a;“嗯嗯&#xff0c;不错不错”,在接下来终于准备大干一场的时候碰壁了&#xff0c;主要情况是说在Mac中跑了第一把的时候发现碰到&#xff0c;虚拟机和宿主机居然…

Vue-1

Vue 简介 Vue 是一个用于"构建用户界面(基于数据渲染出用户看到的画面)" 的渐进式框架 基本使用 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widt…

SpringBoot 2.7.6 集成Activiti 7.1.0.M6 所需的配置文件

<?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 https://…