代码随想录day18--二叉树的应用6

LeetCode530.二叉搜索树的最小绝对差值

题目描述:

给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值 。

差值是一个正数,其数值等于两值之差的绝对值。

示例 1:

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

示例 2:

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

思路:

·求最小绝对差值,因为二叉搜索树是一个有序的树,所以,可以使用中序遍历,再去求保存到数组中的元素的最小绝对差值,这样就会简单很多了

·使用快慢指针(双指针)进行遍历,也可以进行求解,将快指针定义在第一位,慢指针定义为NULL,每次共同移动一个结点

使用数组遍历二叉树代码如下:

class Solution {
public:vector<int> vec;void traversal(TreeNode* cur){//使用中序遍历二叉树,将二叉树保存至数组中if(cur == NULL) return ;traversal(cur->left);vec.push_back(cur->val);traversal(cur->right);}int getMinimumDifference(TreeNode* root) {int result = INT_MAX;traversal(root);for(int i = 1;i < vec.size();i++){//求最小绝对差值result = min(result,vec[i]-vec[i-1]);}return result;}
};

双指针法:

class Solution {
public:int result = INT_MAX;TreeNode* pre = NULL;void traversal(TreeNode* cur){if(cur == NULL) return ;traversal(cur->left);if(pre != NULL){result = min(result,cur->val - pre->val);}pre = cur;traversal(cur->right);}int getMinimumDifference(TreeNode* root) {traversal(root);return result;}
};

总结:遇到二叉搜索树的题目时,如果有要求最值、差值之类的,都要思考一下二叉搜索树是有序的,要利用好这一隐藏条件。

同时要学会在递归中如何记录前后两个指针,这是一个小技巧,我们前面也有用过,后面的题目也一定会用。

LeetCode.501二叉搜索树中的众数

题目描述:

给你一个含重复值的二叉搜索树(BST)的根节点 root ,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。

如果树中有不止一个众数,可以按 任意顺序 返回。

假定 BST 满足如下定义:

  • 结点左子树中所含节点的值 小于等于 当前节点的值
  • 结点右子树中所含节点的值 大于等于 当前节点的值
  • 左子树和右子树都是二叉搜索树

示例 1:

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

示例 2:

输入:root = [0]
输出:[0]

解题思路:

·注意题目中需要遍历的是二叉搜索树,而不是普通二叉树,如果是普通二叉树会难很多,所以这里就不做过多赘述,而二叉搜索树是有序的这一特点要记牢。

·与前一题一样,使用双指针进行解题,定义cur为快指针,pre为慢指针,若cur->val==pre->val则count++,再定义maxCount,若maxCount==count则放入数组中,若不等于则清空数组,最终返回数组

代码如下:

class Solution {
private:int count = 0;int maxCount = 0;TreeNode* pre = NULL;vector<int> vec;void traversal(TreeNode* cur){if(cur == NULL) return ;traversal(cur->left);if(pre == NULL){count = 1;}else if(pre->val == cur->val){count++;}else{count = 1;}pre = cur;if(maxCount == count){vec.push_back(cur->val);}if(maxCount < count){maxCount = count;vec.clear();vec.push_back(cur->val);}traversal(cur->right);}
public:vector<int> findMode(TreeNode* root) {count = 0;pre = NULL;traversal(root);return vec;}
};

总结:本题意在加深对二叉搜索树的理解,当然了,作者我在没看题解之前也是没有想到解法的,要多做题,脑中的想法才会多

LeetCode236.二叉树的最近公共祖先

题目描述:
 

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

示例 1:

输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
输出:3
解释:节点 5 和节点 1 的最近公共祖先是节点 3 。

示例 2:

输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4
输出:5
解释:节点 5 和节点 4 的最近公共祖先是节点 5 。因为根据定义最近公共祖先节点可以为节点本身。

示例 3:

输入:root = [1,2], p = 1, q = 2
输出:1

解题思路:

·这道题的解题思路,需要自底向上查找,就能找到公共祖先了,所以解这道题使用的是后续遍历,根据左右子树的返回值,来处理中节点的逻辑

代码如下:

class Solution {
public:TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {if(root == q || root == p || root == NULL) return root;TreeNode* left = lowestCommonAncestor(root->left,p,q);TreeNode* right = lowestCommonAncestor(root->right,p,q);if(left != NULL && right != NULL) return root;if(left == NULL && right != NULL) return right;else if(left != NULL && right == NULL) return left;else return NULL;}
};

总结:

1.求最下公共祖先,需要自底向上遍历,所以要使用后序遍历,也就是回溯

2.在回溯的过程中,必然要遍历整棵二叉树,即使已经找到了结果,依然要把其他节点遍历完,因为要使用递归函数的返回值(也就算left和right)做逻辑判断

3.要理解如果返回值left为空,right不为空,为什么要返回right,为什么可以用返回right传给上一层结果

需要对二叉树,递归和回溯有一定的理解,有些难度。

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

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

相关文章

CSDN2024年我的创作纪念日1024天|不忘初心|努力上进|积极向前

CSDN2024年我的创作纪念日1024天| 学习成长机遇&#xff1a;学习成长收获&#xff1a;2023年度总结数据&#xff1a;2024新领域的探索&#xff1a;日常和自己的感慨&#xff1a;2024憧憬和规划&#xff1a;创作纪念日总结&#xff1a; 学习成长机遇&#xff1a; 大家好&#x…

SpringBoot-基础篇03

之前搭建了整个开发环境实现了登录注册&#xff0c;springBoot整合mybatis完成增删改查&#xff0c;今天完成分页查询&#xff0c;使用阿里云oss存储照片等资源&#xff0c;后期会尝试自己搭建分布式文件系统来实现。 一&#xff0c;SpringBootMybatis完成分页查询 1&#xff…

天线阵列车载应用——第1章 介绍 1.1节 汽车工业中的天线阵列:应用和频率范围

1.1 汽车工业中的天线阵列:应用和频率范围 无线通信系统的发展需要新的技术来支持更高质量的通信、新的服务和应用。近年来&#xff0c;汽车无线通信市场得到了极大的扩展。现代汽车使用不同的服务:AM/FM收音机、卫星广播(SDARS)、移动电话通信、数字音频广播(DAB)、远程无钥匙…

零基础学编程从入门到精通,系统化的编程视频教程上线,中文编程开发语言工具构件之缩放控制面板构件用法

一、前言 零基础学编程从入门到精通&#xff0c;系统化的编程视频教程上线&#xff0c;中文编程开发语言工具构件之缩放控制面板构件用法 编程入门视频教程链接 https://edu.csdn.net/course/detail/39036 编程工具及实例源码文件下载可以点击最下方官网卡片——软件下载—…

监控室脱岗检测系统-人员脱岗监测报警方案---豌豆云

人员脱岗检测算法自动识别比如保安值班室,监控室中的人员离岗行为,并自动告警给管理人员,约束了工作人员擅自离岗行为。 人员脱岗检测,对违规动作/危险行为/行为规范做精确识别,打造人员脱岗检测,将视频图像智能识别系统应用在企业日常运营管理中,降低生产成本。 应用场景&am…

mysql事务锁

Lock - 事务锁 与 latch 的区别 lock对象是事务&#xff0c;用来锁定的是数据库中的对象&#xff0c;如表、行、页。并且一般lock的对象仅在事务commit或rollback后进行释放&#xff08;不同事务隔离级别释放的时间可能不同&#xff09;。此外&#xff0c;lock&#xff0c;正…

3.0 Zookeeper linux 服务端集群搭建步骤

本章节将示范三台 zookeeper 服务端集群搭建步骤。 所需准备工作&#xff0c;创建三台虚拟机环境并安装好 java 开发工具包 JDK&#xff0c;可以使用 VM 或者 vagrantvirtualbox 搭建 centos/ubuntu 环境&#xff0c;本案例基于宿主机 windows10 系统同时使用 vagrantvirtualb…

发送get请求并且发送请求头(header),java实现

发送get请求时&#xff0c;发送请求头&#xff08;Header&#xff09;中的内容 方便第二次调用其他url时传递参数&#xff0c;例如userCode或者租户编码 调用方式 Autowired private HttpServletRequest request;先注入HttpServletRequestpublic xxx xxx(){String url &quo…

docker程序镜像的制作

目录 一、每种资源的预安装&#xff08;基础&#xff09; 安装 nginx安装 redis 二、dockerfile文件制作&#xff08;基础&#xff09; 打包 redis 镜像 创建镜像制作空间制作dockerfile 打包 nginx 镜像 三、创建组合镜像&#xff08;方式一&#xff09; 生成centos容器并…

vue3+echarts:Vue中使用echarts从后端获取数据并赋值显示

//由于前后端交互,所以使用axios发送请求 const Count ref(null); //设备种类数值 const Name ref(null); //设备种类名称 //设备种类 饼图 const pieChart () > {const getpieChart echarts.init(document.getElementById("deviceKind"));// 创建图标getpieC…

位置内插 PI:基于Positional Interpolation扩大模型的上下文窗口

位置内插 PI&#xff1a;基于Positional Interpolation扩大模型的上下文窗口 如何在不牺牲性能或从头训练的情况下&#xff0c;扩展大型语言模型的上下文窗口以处理长文档或长对话&#xff1f; 论文&#xff1a;https://arxiv.org/pdf/2306.15595.pdf 这篇论文介绍了一种名为位…

详解Python3的垃圾回收机制

Python的垃圾回收机制主要包括两个部分&#xff1a;引用计数和循环引用检测。 引用计数法 内部采用 引用计数法&#xff0c;为每个对象维护引用次数&#xff0c;并据此回收不在需要的垃圾对象。 由于引用计数法存在重大缺陷&#xff0c;循环引用时由内存泄露风险&#xff0c…

自动驾驶TPM技术杂谈 ———— Unix常用命令行

文章目录 介绍常用命令 —— A常用命令 —— C常用命令 —— D常用命令 —— E常用命令 —— F常用命令 —— G常用命令 —— H常用命令 —— I常用命令 —— J常用命令 —— K常用命令 —— L常用命令 —— M常用命令 —— N常用命令 —— P常用命令 —— Q常用命令 —— R常用…

Vue3——创建一个应用

文章目录 创建应用实例挂载应用没有模板的组件的挂载 应用配置多个应用实例 其实使用脚手架创建的vue项目的main.js文件中已经为我们配置好 vue应用的创建。 import { createApp } from vue import App from ./App.vue const app createApp(App) app.mount(#app)创建应用实例…

C++ JSON解析

JSON解析 JSONCPPC实现JSON解析器 JSONCPP JSONCPP源码链接&#xff1a;https://github.com/open-source-parsers/jsoncpp JSOCPP源码下载以后&#xff0c;首先复制一份include文件夹下的json文件夹&#xff0c;头文件留着后续备用。 使用Cmake生成项目。在IDE中编译jsoncpp_…

【Nicn的刷题日常】之打印整数二进制的奇数位和偶数位

目录 1.题目描述 2.解题思路 3.解题 1.题目描述 获取一个整数二进制序列中所有的偶数位和奇数位&#xff0c;分别打印出二进制序列 2.解题思路 1. 提取所有的奇数位&#xff0c;如果该位是1&#xff0c;输出1&#xff0c;是0则输出0 2. 以同样的方式提取偶数位置检测n…

CGAL-3D 凸包算法

3D 凸包算法 一、概述二、静态凸包构造1. Traits 特征类2. 极端点3. 半空间相交4. 凸性检验 三、动态凸包构造四、性能 一、概述 一个点集 S∈R3 是凸的&#xff0c;如果对于任意两点 p 和 q 在集合中&#xff0c;具有端点的线段 p 和 q 包含在 S。集合的凸包 P 包含点集 S 的最…

GADM 4.1 全球国家行政区划下载

扫描文末二维码&#xff0c;关注微信公众号&#xff1a;ThsPool 后台回复g004&#xff0c;领取最新 GADM 4.1 全球国家行政区划 GADM概述 GADM&#xff0c;全称 Database of Global Administrative Areas&#xff0c;是一个开放获取的全球行政区划数据库&#xff0c;包含各国、…

APIfox编排自动化测试场景(一)

测试场景用于将多个接口请求与实际可能发生的一些特殊情况&#xff08;如条件判断、循环&#xff09;有序的组合在一起&#xff0c;来模拟一个真实业务流程&#xff0c;组成自动化测试单元。 新建目录 / 测试场景​ 打开 Apifox 后点击左侧菜单栏中的“自动化测试”&#xff…

基于Vue的移动端UI框架整理

一、Vant 官方地址&#xff1a;https://youzan.github.io/vant/#/zh-CN/ 简介&#xff1a;有赞公司开发。 特性&#xff1a;60 高质量组件、90% 单元测试覆盖率、完善的中英文文档和示例、支持按需引入、支持主题定制、支持国际化、支持 TS、支持 SSR。 特别说明&#xff1…