LeetCode530. 二叉搜索树的最小绝对差
1.力扣151. 反转字符串中的单词2.LeetCode515.在每个树行中找最大值3.LeetCode104.二叉树的最大深度4.LeetCode111.二叉树的最小深度5.LeetCode136. 只出现一次的数字6.LeetCode260. 只出现一次的数字 III7.LeetCode151. 反转字符串中的单词8.LeetCode225. 用队列实现栈9.LeetCode102.二叉树的层序遍历10.LeetCode107.二叉树的层序遍历II11.LeetCode199.二叉树的右视图12.LeetCode637.二叉树的层平均值13.LeetCode226. 翻转二叉树14.LeetCode455.分发饼干15.LeetCode860. 柠檬水找零16.LeetCode122. 买卖股票的最佳时机 II17.LeetCode1005. K 次取反后最大化的数组和18.LeetCode53. 最大子数组和19.LeetCode513. 找树左下角的值20.LeetCode135. 分发糖果21.LeetCode222.完全二叉树的节点个数22.LeetCode700. 二叉搜索树中的搜索23.LeetCode98. 验证二叉搜索树
24.LeetCode530. 二叉搜索树的最小绝对差
25.LeetCode654. 最大二叉树26.LeetCode617. 合并二叉树27.回溯算法介绍以及模板28.LeetCode216.组合总和lll29.LeetCode39. 组合总和30.LeetCode40.组合总和II31.动态规划方法论32.线性dp:编辑距离33.线性dp:大盗阿福(打家劫舍)34.LeetCode300.最长递增子序列35.线性dp:LeetCode674. 最长连续递增序列36.线性dp:LeetCode516 .最长回文子序列37.线性dp:LeetCode122.买卖股票的最佳时机ll题目链接:https://leetcode.cn/problems/minimum-absolute-difference-in-bst/description/
题目叙述:
给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值 。
差值是一个正数,其数值等于两值之差的绝对值。
示例 1:
输入:root = [4,2,6,1,3] 输出:1
示例 2:
输入:root = [0] 输出:[0]
提示:
树中节点的数目在范围 [1, 10^4] 内
-10^5 <= Node.val <= 10^5
进阶:你可以不使用额外的空间吗?(假设由递归产生的隐式调用栈的开销不被计算在内)
思路:
我们可以利用二叉搜索树的性质,因为二叉搜索树的左子树的结点值最小,中间结点其次,右子树的结点值最大,因此我们可以采用中序遍历,将结点的值一次存入数组中,最后数组一定是个有序的
序列,我们只需要对比相邻两项之差的绝对值的最小值即可。
代码:
class Solution { private: //创建全局变量vec作为数组存储所有结点 vector<int> vec; void traversal(TreeNode* root) { if (root == NULL) return; traversal(root->left); //中序遍历,将结点放入数组中 vec.push_back(root->val); traversal(root->right); } public: int getMinimumDifference(TreeNode* root) { vec.clear(); //得到的数组是一个有序的数组 traversal(root); if (vec.size() < 2) return 0; int result = INT_MAX; //因为这个数组是有序的数组,所以我们只需要比较相邻两个结点 for (int i = 1; i < vec.size(); i++) { //找出最小的节点之差 result = min(result, vec[i] - vec[i - 1]); } return result; } };
进阶
这题我们还可以不使用额外的数组空间,我们可以直接使用pre指针,存储上一个结点遍历的值,直接对比就行了
上代码:
class Solution { public: //作为结果 int result=INT_MAX; //用于存储上次遍历的结点 TreeNode* pre=NULL; void traversal(TreeNode*cur){ if(cur==NULL) return; //递归处理左子树 traversal(cur->left); //先对pre判空 if(pre!=NULL) result=min(result,cur->val-pre->val); //更新pre的值 pre=cur; //递归处理右子树 traversal(cur->right); } int getMinimumDifference(TreeNode* root) { traversal(root); return result; } };
迭代法
递归法能做的,迭代法也能做!以下我给出中序遍历的迭代法
class Solution { public: int getMinimumDifference(TreeNode* root) { stack<TreeNode*> st; TreeNode* cur = root; TreeNode* pre = NULL; int result = INT_MAX; while (cur != NULL || !st.empty()) { if (cur != NULL) { // 指针来访问节点,访问到最底层 st.push(cur); // 将访问的节点放进栈 cur = cur->left; // 左 } else { cur = st.top(); st.pop(); if (pre != NULL) { // 中 //找出最小的绝对值之差 result = min(result, cur->val - pre->val); } pre = cur; cur = cur->right; // 右 } } return result; } };
总结:
遇到在二叉搜索树上求什么最值,求差值之类的,都要思考一下二叉搜索树可是有序的,要利用好这一特点。
同时要学会在递归遍历的过程中如何使用两个指针来遍历,这个技巧很好用
合集:
LeetCode
分类:
LeetCode / 二叉树
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了