题目
给定一个所有节点为非负值的二叉搜索树,求树中任意两节点的差的绝对值的最小值。
示例 :
输入:
1
\
3
/
2
输出:
1
解释:
最小绝对差为1,其中 2 和 1 的差的绝对值为 1(或者 2 和 3)。
注意: 树中至少有2个节点。
分析
对于一个节点来说,离他最近的节点是左子树的最大节点和右子树的最小节点,遍历节点得到这两个节点的值分别与当前节点进行计算得到较小的值,然后再与设定的min值进行比较即可.最后遍历完所有节点得到的就是最小值.
代码
int min = Integer.MAX_VALUE;
public int getMinimumDifference(TreeNode root) {
//一个节点的最小绝对差,必然在右子树的最小节点,与左子树的最大节点直接产生。
if (root.left != null) {
int leftMax = Math.abs(root.val - maxMum(root.left).val);
min = leftMax > min ? min : leftMax;
getMinimumDifference(root.left);
}
if (root.right != null) {
int rightMin = Math.abs(root.val -miniMum(root.right).val);
min = rightMin > min ? min : rightMin;
getMinimumDifference(root.right);
}
return min;
}
private TreeNode miniMum(TreeNode node) {
if (node.left == null) {
return node;
}
return miniMum(node.left);
}
private TreeNode maxMum(TreeNode node) {
if (node.right == null) {
return node;
}
return maxMum(node.right);
}
TreeNode pre = null;
public int getMinimumDifference2(TreeNode root) {
//中序遍历,记录前一个值,计算差值
inOrder(root);
return min;
}
private void inOrder(TreeNode node){
if(node == null){
return;
}
inOrder(node.left);
if(pre != null){
int ans = Math.abs(pre.val - node.val);
min = ans>min?min:ans;
}
pre = node;
inOrder(node.right);
}