java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846 |
---|
解题思路:时间复杂度O(n),空间复杂度O(n) |
---|
- 一个有序序列,最小的差值一定出现在两个相邻的元素之间。因为是有序的,间隔越远,肯定差的越多,而间隔越近,差的越少。
- 而二叉搜索树就是一个有序序列,而且中序遍历正好是升序序列。
- 所以我们可以在中序遍历的过程中,获取中序遍历相邻两个结点的差值。
代码 |
---|
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
private int pre = -1;//保存中序遍历,正在遍历的当前结点的前一个结点
private int minDifference = Integer.MAX_VALUE;//保存两个结点的最小差值
public int getMinimumDifference(TreeNode root) {
if(root == null) return 0;//如果root为null那么差值为0
getMinimumDifference(root.left);//中序遍历,先遍历左子树
//如果pre不是-1的话,说明当前中序遍历已经不是第一个结点了,所以我们求出目前的最小差值
if(pre != -1) minDifference = Math.min(minDifference,Math.abs(pre - root.val));
//pre进行记录,它就是下一次遍历结点的前驱
pre = root.val;//中序遍历,中间
getMinimumDifference(root.right);//中序遍历,然后遍历右子树
return minDifference;//返回差值
}
}