代码随想录第十八天 | Leecode 530. 二叉搜索树的最小绝对差、501. 二叉搜索树中的众数、236. 二叉树的最近公共祖先
530. 二叉搜索树的最小绝对差
题目描述
给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值 。
差值是一个正数,其数值等于两值之差的绝对值。
- 示例 1:
输入:root = [4,2,6,1,3]
输出:1
- 示例 2:
输入:root = [1,0,48,null,null,12,49]
输出:1
解法1 中序遍历递归求解
class Solution {
public:
void inOrder(TreeNode* root, vector<int>& inOrderVec, int& minAbs){
if(!root) return;
inOrder(root->left, inOrderVec, minAbs);
if(!inOrderVec.empty()){
int curAbs = root->val - inOrderVec[inOrderVec.size()-1];
if(curAbs < minAbs) minAbs = curAbs;
}
inOrderVec.push_back(root->val);
inOrder(root->right, inOrderVec, minAbs);
return;
}
int getMinimumDifference(TreeNode* root) {
vector<int> inOrderVec;
int result = 100000;
inOrder(root, inOrderVec, result);
return result;
}
};
Leecode 501. 二叉搜索树中的众数
题目描述
给你一个含重复值的二叉搜索树(BST)的根节点 `root· ,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。
如果树中有不止一个众数,可以按 任意顺序 返回。
假定 BST 满足如下定义:
结点左子树中所含节点的值 小于等于 当前节点的值
结点右子树中所含节点的值 大于等于 当前节点的值
左子树和右子树都是二叉搜索树
- 示例 1:
输入:root = [1,null,2,2]
输出:[2]
- 示例 2:
输入:
root = [0]
输出:[0]
解法1 暴力搜索
首先看到二叉搜索树,就要立刻想到二叉搜索树的中序遍历就是有序数组。而本题只要拿到中序遍历序列之后,只需要求出序列中出现次数最多的多个值即可。故可将本题拆分为以下几个步骤:
- 先求出中序遍历有序数组
- 遍历数组记录每个值的出现次数,同时记录下其中的最大值(即为众数出现的次数)
- 在根据记录的结果中查看,出现次数最大的都有哪些节点
可以得到代码如下:
class Solution {
public:
void inOrder(TreeNode* curNode, vector<int>& ordVec){ // 求中序遍历
if(!curNode) return;
inOrder(curNode->left, ordVec);
ordVec.push_back(curNode->val);
inOrder(curNode->right, ordVec);
return;
}
vector<int> findMode(TreeNode* root) {
vector<int> inOrderVec;
inOrder(root, inOrderVec); // 求中序遍历
unordered_map<int,int> umap; // 建立哈希表
int maxCount = 0;
for(auto val: inOrderVec){ // 用哈希表来记录每个节点出现次数,同时记录出现最大次数
umap[val]++;
if(umap[val] > maxCount) maxCount = umap[val];
}
vector<int> result;
for(auto i : umap){ // 再将所有众数都存放到结果中
if(i.second == maxCount) result.push_back(i.first);
}
return result;
}
};
Leecode 236. 二叉树的最近公共祖先
题目描述
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
最近公共祖先的定义为:“对于有根树 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
解法1 先求路径再求公共祖先
由于要求的是最深的祖先节点,本题应当是要自下而上的去查找,故应当考虑使用回溯的方法。而之前又做过一道利用回溯来求每个叶节点路径的题目,而本题也可以先求出两个目标节点的路径,再比较两个节点路径中最后一个相等的值,即为要找到公共祖先。根据这个思路可以得到代码如下:
class Solution {
public:
void findPath(TreeNode* curNode, TreeNode* targetNode, vector<TreeNode*>& curPath, vector<TreeNode*>& resultPath){
if(!curNode) return;
curPath.push_back(curNode);
if(curNode == targetNode){
resultPath = curPath;
return;
}
findPath(curNode->left, targetNode, curPath, resultPath);
findPath(curNode->right, targetNode, curPath, resultPath);
curPath.pop_back(); // 回溯,移除当前节点
}
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
vector<TreeNode*> tmpPath1, tmpPath2, pPath, qPath;
findPath(root, p, tmpPath1, pPath);
findPath(root, q, tmpPath2, qPath);
int size = min(pPath.size(), qPath.size());
TreeNode* result;
for(int i = 0; i < size; i++){
if(pPath[i] == qPath[i]) result = pPath[i];
else break;
}
return result;
}
};
今日总结
今天得先去写一下课内计网的作业,因此这三道题的其他解法暂时就不写下来了,之后再来补上。
今日Leecode进度已到67题
代码随想录第十八天 | Leecode 530. 二叉搜索树的最小绝对差、501. 二叉搜索树中的众数、236. 二叉树的最近公共祖先的更多相关文章
- 代码随想录算法训练营day21 | leetcode ● 530.二叉搜索树的最小绝对差 ● 501.二叉搜索树中的众数 ● ***236. 二叉树的最近公共祖先
LeetCode 530.二叉搜索树的最小绝对差 分析1.0 二叉搜索树,中序遍历形成一个升序数组,节点差最小值一定在中序遍历两个相邻节点产生 ✡✡✡ 即 双指针思想在树遍历中的应用 class So ...
- [LeetCode]230. 二叉搜索树中第K小的元素(BST)(中序遍历)、530. 二叉搜索树的最小绝对差(BST)(中序遍历)
题目230. 二叉搜索树中第K小的元素 给定一个二叉搜索树,编写一个函数 kthSmallest 来查找其中第 k 个最小的元素. 题解 中序遍历BST,得到有序序列,返回有序序列的k-1号元素. 代 ...
- Java实现 LeetCode 530 二叉搜索树的最小绝对差(遍历树)
530. 二叉搜索树的最小绝对差 给你一棵所有节点为非负值的二叉搜索树,请你计算树中任意两节点的差的绝对值的最小值. 示例: 输入: 1 \ 3 / 2 输出: 1 解释: 最小绝对差为 1,其中 2 ...
- Leetcode:530. 二叉搜索树的最小绝对差
Leetcode:530. 二叉搜索树的最小绝对差 Leetcode:530. 二叉搜索树的最小绝对差 Talk is cheap . Show me the code . /** * Definit ...
- [LC]530题 二叉搜索树的最小绝对差
①题目 给定一个所有节点为非负值的二叉搜索树,求树中任意两节点的差的绝对值的最小值. 示例 : 输入: 1 \ 3 / 2 输出:1 解释:最小绝对差为1,其中 2 和 1 的差的绝对值为 ...
- 530 Minimum Absolute Difference in BST 二叉搜索树的最小绝对差
给定一个所有节点为非负值的二叉搜索树,求树中任意两节点的差的绝对值的最小值.示例 :输入: 1 \ 3 / 2输出:1解释:最小绝对差为1,其中 2 和 1 的差的绝对值为 ...
- [LeetCode] Minimum Absolute Difference in BST 二叉搜索树的最小绝对差
Given a binary search tree with non-negative values, find the minimum absolute difference between va ...
- [Swift]LeetCode530. 二叉搜索树的最小绝对差 | Minimum Absolute Difference in BST
Given a binary search tree with non-negative values, find the minimum absolute difference between va ...
- C#LeetCode刷题之#530-二叉搜索树的最小绝对差(Minimum Absolute Difference in BST)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4123 访问. 给定一个所有节点为非负值的二叉搜索树,求树中任意两 ...
- LeetCode530. 二叉搜索树的最小绝对差
题目 又是常见的BST,要利用BST的性质,即中序遍历是有序递增序列. 法一.中序遍历 1 class Solution { 2 public: 3 vector<int>res; 4 v ...
随机推荐
- mac安装nodejs、npm包设置
一.安装nodejs 1.下载自己系统的nodejs,我选择18.20版本 https://nodejs.cn/download/ 二.设置 1.设置镜像源: npm config set regis ...
- NLLB 与 ChatGPT 双向优化:探索翻译模型与语言模型在小语种应用的融合策略
作者:来自 vivo 互联网算法团队- Huang Minghui 本文探讨了 NLLB 翻译模型与 ChatGPT 在小语种应用中的双向优化策略.首先介绍了 NLLB-200 的背景.数据.分词器和 ...
- 【攻防世界】BadProgrammer
BadProgrammer(原型链污染) 题目来源 攻防世界 NO.GFSJ0986 题目描述 打开网址页面如下,没有什么有用信息 用dirsearch扫一下目录,发现/static../(用御剑扫不 ...
- 基于RAG的MaxKB知识库问答系统如何选择向量模型
在MaxKB中替换向量模型前,我们需要先了解向量相关的原理和技术,此处不做赘述,大家可以自行学习.可以了解下Embedding.Embedding核心,向量库等内容. 一.MaxKB 默认向量模型 M ...
- 百万架构师第四十六课:并发编程的原理(一)|JavaGuide
百万架构师系列文章阅读体验感更佳 原文链接:https://javaguide.net 并发编程的原理 课程目标 JMM 内存模型 JMM 如何解决原子性.可见性.有序性的问题 Synchronize ...
- mySql跳过行数获取多少行
LIMIT :需要获取多少条记录 OFFSET :跳过前面的多少行记录从后面开始获取 SELECT * FROM USER LIMIT 32 OFFSET 1 只获取12行记录 跳过第一条记录 SEL ...
- Web前端入门第1问:英语是否很重要?有哪些前置条件?
HELLO,这里是大熊学习前端开发的入门笔记. 本系列笔记基于 windows 系统. 在入门之前,是否有这样的疑问: 程序员的英语是否很牛?毕竟程序员的代码像天书一样,比如这样: 答案是否定的. 英 ...
- Vim编辑windows格式文件出现的[noeol][dos]的含义、解决方法及方法解释
文章目录 前言 [dos] [noeol] 前言 最近想要将保存再windows的文件传到linux上,传进去保存文件之后,用vim打开发现在文件的底下出现了[dos] [noeol]这两个标志.然后 ...
- MOS管的引脚,G、S、D分别代表什么?
引脚解析: G:gate 栅极,N沟道的电源一般接在D. S:source 源极,输出S,P沟道的电源一般接在S. D:drain 漏极,输出D.增强耗尽接法基本一样. mos管是金属(metal)- ...
- 对象命名为何需要避免'-er'和'-or'后缀
之前写过两篇关于软件工程中对象命名的文章:开发中对象命名的一点思考与对象命名怎么上手?从现实世界,但感觉还是没有说透, 在软件工程中,如果问我什么最重要,我的答案是对象命名.良好的命名能够反映系统的本 ...





