LeetCode - 530. Minimum Absolute Difference in BST
链接
530. Minimum Absolute Difference in BST
题意
给定一个没有负数的二叉搜索树,找出任意两点节点值之差的绝对值的最小值。
二叉搜索树:对于树中的每个节点X,它的左子树中所有关键字值小于X的关键字值,而它的右子树中所有关键字值大于X的关键字值。——数据结构与算法分析
思路
利用二叉搜索树的性质可知,所求值可能出现在以下两处:
- 根节点左/右子树相邻两个节点之差
- 根节点左子树最大值和根节点右子树最小值
那么利用递归,在遍历时记录上一个遍历的节点(pre),然后用当前节点减去pre即可获得相邻节点之差。而且遍历完左子树最后一个节点,进入根节点右子树前,pre刚好为左子树最大值,而此时根节点为右子树最小值,因此可以检测条件2
代码
Java:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
int min = Integer.MAX_VALUE;
int pre = -1;
public int getMinimumDifference(TreeNode root) {
if (root == null) return min;
getMinimumDifference(root.left);
if (pre != -1) {
min = Math.min(min, root.val - pre);
}
pre = root.val;
getMinimumDifference(root.right);
return min;
}
}
效率
Your runtime beats 53.59% of java submissions.
非BST的解法
代码源自LeetCode讨论区。利用了java的排序树。
public class Solution {
TreeSet<Integer> set = new TreeSet<>();
int min = Integer.MAX_VALUE;
public int getMinimumDifference(TreeNode root) {
if (root == null) return min;
if (!set.isEmpty()) {
if (set.floor(root.val) != null) {
min = Math.min(min, root.val - set.floor(root.val));
}
if (set.ceiling(root.val) != null) {
min = Math.min(min, set.ceiling(root.val) - root.val);
}
}
set.add(root.val);
getMinimumDifference(root.left);
getMinimumDifference(root.right);
return min;
}
}