给你一棵所有节点为非负值的二叉搜索树,请你计算树中任意两节点的差的绝对值的最小值。
示例:
输入:
1
3
/
2
3
/
2
输出:
1
1
解释:
最小绝对差为 1,其中 2 和 1 的差的绝对值为 1(或者 2 和 3)。
最小绝对差为 1,其中 2 和 1 的差的绝对值为 1(或者 2 和 3)。
思路:利用BST中序遍历的性质:中序遍历得到的是一个递增的序列,因此只要求相邻节点的最小值即可。
需增加一个临时结点用以保存上次访问的结点(递归的临时变量需设置成全局变量)
增加一个临时变量用以保存最小值
我的代码
public int getMinimumDifference(TreeNode root) { List<Integer> list = new ArrayList<Integer>(); minDiff(root, list); Collections.sort(list); int min = Integer.MAX_VALUE; for (int i = 0; i < list.size() - 1; i++) { min = Math.min(min, Math.abs(list.get(i) - list.get(i + 1))); } return min; } public void minDiff(TreeNode root, List<Integer> list) { if (root == null) { return; } list.add(root.val); minDiff(root.left, list); minDiff(root.right, list); }
参考答案
TreeNode pre = null; int res = Integer.MAX_VALUE; public int getMinimumDifference(TreeNode root) { if (null == root) { return 0; } inorder(root); return res; } public void inorder(TreeNode root) { if (root == null) { return; } inorder(root.left); if (null != pre) { // res = Math.min(res, Math.abs(pre.val - root.val)); //为什么可以不用求绝对值? 因为中序遍历BST是递增序列 res = Math.min(res, Math.abs(root.val - pre.val)); } pre = root; inorder(root.right); }