持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第5天,点击查看活动详情
本文已参与[新人创作礼]活动,一起开启掘金创作之路
题目
530. 二叉搜索树的最小绝对差
难度简单347
给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值 。
差值是一个正数,其数值等于两值之差的绝对值。
示例 1:
输入: root = [4,2,6,1,3]
输出: 1
示例 2:
输入: root = [1,0,48,null,null,12,49]
输出: 1
提示:
- 树中节点的数目范围是
[2, 104] 0 <= Node.val <= 105
思路:
注意这是二叉搜索树,二叉搜索树是有序的。遇到二叉搜索树上求最值,求差值等问题,可以把它想成一个有序数组来求最值,求差值,这样就简单许多了
这里我们用前一个数减去后一个数求最小差值,本来可以用数组来代替,这里不用数组,数组增加了空间复杂度。
对二叉搜索树进行中序遍历的过程中,我们可以直接找到相邻两个节点的差值——用一个pre节点记录root节点的前一个节点。 pre代表前一个数.
代码1
class Solution {
public:
int ans = 100000; //最大差值 大于100000即可
int pre = -9999; //小于-9999即可
vector<int> ret;
void reversal(TreeNode*root) {
if (root == nullptr ) return;
reversal(root->left); //左
ans = min(ans, root->val - pre);
pre = root->val;
reversal(root->right); //右
}
int getMinimumDifference(TreeNode* root) {
reversal(root);
return ans;
}
};
代码2
class Solution {
public:
void dfs(TreeNode* root, int& pre, int& ans) {
if (root == nullptr) { //如果为空直接返回,表示这一层循环作废
return;
}
dfs(root->left, pre, ans); //左
if (pre == -1) {
pre = root->val;
} else {
ans = min(ans, root->val - pre);
pre = root->val;
}
dfs(root->right, pre, ans);
}
int getMinimumDifference(TreeNode* root) {
int ans = INT_MAX, pre = -1; //注意这里的-1
dfs(root, pre, ans);
return ans;
}
};