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

题目链接: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;
}
};

总结:

遇到在二叉搜索树上求什么最值,求差值之类的,都要思考一下二叉搜索树可是有序的,要利用好这一特点。

同时要学会在递归遍历的过程中如何使用两个指针来遍历,这个技巧很好用

posted @   Tomorrowland_D  阅读(42)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示