题目地址:
https://www.lintcode.com/problem/minimum-distance-between-bst-nodes/description
给定一棵二叉搜索树,题目保证没有两个节点数值相等。问树中任意两个节点的差的最小值(这里的差指的是大减小)。
思路是DFS。注意到两个节点差的最小值,一定是某个节点与其左子树最大值的差,或者是某个节点右子树最小值与其的差得到。所以可以DFS的同时将以当前节点为树根的子树的最大和最小值返回给上层。遍历到某个节点的时候,先找其左子树的最大最小值,再找其右子树的最大最小值,用当前节点与左子树最大值的差来更新答案,再用右子树最小值和当前节点的差来更新答案,接着将当前子树的最小值(也就是左子树最小值)和当前子树的最大值(也就是右子树最大值)返回给上层。注意考虑空树的情况。代码如下:
public class Solution {
private int res;
/**
* @param root: a Binary Search Tree (BST) with the root node
* @return: the minimum difference
*/
public int minDiffInBST(TreeNode root) {
// Write your code here.
res = Integer.MAX_VALUE;
dfs(root);
return res;
}
// 将cur子树的最小最大值包装成一个数组返回给上层递归
private int[] dfs(TreeNode cur) {
if (cur == null) {
return null;
}
int[] left = null, right = null;
int[] ret = {cur.val, cur.val};
// 如果左子树不空,则用当前节点和左子树最大值的差来更新res,
// 并将左子树最小值赋值给ret[0]
if (cur.left != null) {
left = dfs(cur.left);
ret[0] = left[0];
res = Math.min(res, cur.val - left[1]);
}
// 同上
if (cur.right != null) {
right = dfs(cur.right);
ret[1] = right[1];
res = Math.min(res, right[0] - cur.val);
}
return ret;
}
}
class TreeNode {
int val;
TreeNode left, right;
public TreeNode(int val) {
this.val = val;
}
}
时间复杂度 O ( n ) O(n) O(n),空间 O ( 1 ) O(1) O(1)。