树与图简单1 种解法
#530二叉搜索树的最小绝对差
返回二叉搜索树任意两个不同节点值之间的最小绝对差。
#二叉搜索树#中序遍历#深度优先搜索
原题
给你一个二叉搜索树的根节点 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
注意:本题与 783 https://leetcode.cn/problems/minimum-distance-between-bst-nodes/ 相同
解题主线
- 中序序列有序,最小差一定出现在相邻元素之间。
解法 1:中序相邻比较
递归中序遍历,用方法内 holder 保存前驱和当前最小差。
-
时间复杂度: O(n)
-
空间复杂度: O(h)
import java.util.*;
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int val) {
this.val = val;
}
}
class Solution {
public int getMinimumDifference(TreeNode root) {
TreeNode[] previous = new TreeNode[1];
int[] answer = {Integer.MAX_VALUE};
inorder(root, previous, answer);
return answer[0];
}
private void inorder(TreeNode node, TreeNode[] previous, int[] answer) {
if (node == null) return;
// BST 中序序列严格递增,最小差只需检查相邻节点
inorder(node.left, previous, answer);
if (previous[0] != null) {
answer[0] = Math.min(answer[0], node.val - previous[0].val);
}
// 在进入右子树前同步更新全局中序前驱
previous[0] = node;
inorder(node.right, previous, answer);
}
}边界与易错点
- 前驱节点和最小值不能作为未重置的实例状态。
- 至少两个节点是题目约束,方法可据此返回最终最小值。
整理来源
由旧仓库源码复核、去重并整理;展示代码已按 Java 21 语义修正明显问题。
leetcode/src/main/java/tree/Q530_getMinimumDifference.java