leetcode530 二叉搜索树的最小绝对差

给你一棵所有节点为非负值的二叉搜索树,请你计算树中任意两节点的差的绝对值的最小值。
 
示例:
输入:
   1
    \
     3
    /
   2
输出:
1
解释:
最小绝对差为 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);
	}

  

 
posted on 2020-10-12 17:26  lkjhgfdsa123  阅读(136)  评论(0编辑  收藏  举报