代码随想录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.hqwc.cn/news/455193.html

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

相关文章

【紧耦合新范式】Think-on-Graph:解决大模型在医疗、法律、金融等垂直领域的幻觉

Think-on-Graph&#xff1a;解决大模型在医疗、法律、金融等垂直领域的幻觉 Think-on-Graph 原理ToG 算法步骤&#xff1a;想想再查&#xff0c;查查再想实验结果 论文&#xff1a;https://arxiv.org/abs/2307.07697 代码&#xff1a;https://github.com/IDEA-FinAI/ToG Think…

大数据企业应用场景分析

目录 一、企业分析 1.1 企业领域维度分析 1.2 技术服务型维度分析 1.3 细分领域维度分析 二、大数据应用场景 2.1 数据分析 2.2 智能推荐 2.3 产品/流程优化 2.4 异常监测 2.5 智能管理 2.6 人工智能和机器学习 三、总结 前言&#xff1a;想讲清楚大数据应用对企业…

问题排查利器 - 分布式 trace

在分布式系统开发中&#xff0c;系统间的调用往往会横跨多个应用之间的接口。负责的调用链路也导致了&#xff0c;当线上环境出现问题时&#xff0c;例如请求失败、延迟增加或错误发生&#xff0c;我们无法第一时间确定是哪个环节出了问题&#xff0c;这给故障排查和修复带来了…

CleanMyMacX4.14.6如何清理mac垃圾内存

一直以来&#xff0c;苹果电脑的运行流畅度都很好&#xff0c;但是垃圾内存多了磁盘空间慢慢变少&#xff0c;还是会造成卡顿的。这篇文章就告诉大家电脑如何清理垃圾内存&#xff0c;电脑如何清理磁盘空间。 一、电脑如何清理垃圾内存 垃圾内存指的是各种缓存文件和系统垃圾…

第二篇:MySQL安装与配置(基于小皮面板(phpstudy))

在第一篇中介绍了数据库的相关概念&#xff0c;了解到SQL是用来操作数据库管理系统的语言&#xff0c;因此要学习数据库技术&#xff0c;数据库管理系统的配备是必不可少的&#xff01; 并且出于流行性与实惠性的双考量而选择MySQL这款数据库管理系统软件 一&#xff0c;工具推…

RabbitMQ 安装

下载erlang语言&#xff1a; erlang语言 下载RabbitMQ rabbitmq 安装erlang 1.以管理员身份安装erlang 2.弹出框选择next 3.选择安装路径&#xff0c;亦可以安装在默认路径 4.接下来一路点击下一步&#xff0c;无需任何修改&#xff0c;直到 install安装为止&#xff…

[BUUCTF]-PWN:inndy_echo解析

查看保护 查看ida 有格式化字符串漏洞&#xff0c;可以修改printf的got表内地址为system&#xff0c;传参getshell 解法一&#xff1a; 在32位中可以使用fmtstr_payload直接修改&#xff0c;免去很多麻烦 完整exp&#xff1a; from pwn import* pprocess(./echo) premote(n…

私有化部署一个吃豆人小游戏

目录 效果 安装步骤 1.安装并启动httpd 2.下载代码 3.启动httpd 使用 效果 安装步骤 1.安装并启动httpd yum -y install httpd 2.下载代码 进入目录 cd /var/www/html/ 下载 git clone https://gitee.com/WangZhe168_admin/pacman-canvas.git 3.启动httpd syste…

Postman发送带登录信息的请求

环境&#xff1a;win10Postman10.17.7 假设有个请求是这样的&#xff1a; RequiresPermissions("tool:add") PostMapping(value"/predict") ResponseBody /** * xxx * param seqOrderJson json格式的参数 * return */ public String predictSampleIds(Req…

第1节、电路连接【51单片机+L298N步进电机系列】

↑↑↑点击上方【目录】&#xff0c;查看本系列全部文章 摘要&#xff1a;本节介绍如何搭建一个51单片机L298N步进电机控制电路&#xff0c;所用材料均为常见的模块&#xff0c;简单高效的方式搭建起硬件环境。 一、硬件清单 ①51单片机模块 ②恒流模块 ③开关电源 ④L298N模…

Springboot启动出现Waiting for changelog lock...问题

今天在开发的时候&#xff0c;Springboot启动的时候出现Waiting for changelog lock…问题. 问题原因&#xff1a;该问题就是发生了数据库的死锁问题&#xff0c;可能是由于一个杀死的liquibase进程没有释放它对DATABASECHANGELOGLOCK表的锁定&#xff0c;导致服务启动失败&…

软考21-上午题-数组、矩阵

数组&#xff1a;一组地址连续的空间。 数组是定长线性表在维数上的扩展&#xff0c;即&#xff0c;线性表中的元素又是一个线性表。 一、数组 数组的特点&#xff1a; 数组数目固定&#xff0c;一旦定义了数组结构&#xff0c;不再有元素个数的增减变化。因此&#xff0c;数…