一【题目类别】
- 树
二【题目难度】
- 简单
三【题目编号】
- 530.二叉搜索树的最小绝对差
四【题目描述】
- 给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值 。
- 差值是一个正数,其数值等于两值之差的绝对值。
五【题目示例】
-
示例 1:
- 输入:root = [4,2,6,1,3]
- 输出:1
-
示例 2:
- 输入:root = [1,0,48,null,null,12,49]
- 输出:1
六【解题思路】
- 本题需要利用二叉搜索树的性质:对二叉搜索树进行中序遍历,会得到升序序列
- 既然可以得到升序序列,那么最小的差值肯定在相邻节点中产生
- 所以我们只需要比较哪个相邻节点的差值最小就可以了
- 最后返回结果即可
- 本文提供了C语言(递归)和Java语言(迭代)两种写法
七【题目提示】
- 树 中 节 点 的 数 目 范 围 是 [ 2 , 1 0 4 ] 树中节点的数目范围是 [2, 10^4] 树中节点的数目范围是[2,104]
- 0 < = N o d e . v a l < = 1 0 5 0 <= Node.val <= 10^5 0<=Node.val<=105
八【题目注意】
九【时间频度】
- 时间复杂度: O ( n ) O(n) O(n),其中 n n n为树的节点个数
- 空间复杂度: O ( h ) O(h) O(h),其中h为树的高度,也就是递归栈的深度
十【代码实现】
- Java语言版
class Solution {
public int getMinimumDifference(TreeNode root) {
Stack<TreeNode> stack = new Stack<>();
TreeNode pre = null;
int min = Integer.MAX_VALUE;
while(!stack.isEmpty() || root != null){
while(root != null){
stack.push(root);
root = root.left;
}
root = stack.pop();
if(pre != null && root.val - pre.val < min){
min = root.val - pre.val;
}
pre = root;
root = root.right;
}
return min;
}
}
- C语言版
void dfs_getRes(struct TreeNode* root,int* min,int* pre)
{
if(root != NULL)
{
dfs_getRes(root->left,min,pre);
if(*pre != -1 && root->val - *pre < *min)
{
*min = root->val - *pre;
}
*pre = root->val;
dfs_getRes(root->right,min,pre);
}
}
int getMinimumDifference(struct TreeNode* root)
{
int min = INT_MAX;
int pre = -1;
dfs_getRes(root,&min,&pre);
return min;
}
十一【提交结果】
-
Java语言版
-
C语言版