1. 题目
给你一棵所有节点为非负值的二叉搜索树,请你计算树中任意两节点的差的绝对值的最小值。
示例:
输入:
[1,null,3,2]
输出:
1
解释:
最小绝对差为 1,其中 2 和 1 的差的绝对值为 1(或者 2 和 3)。
提示:
树中至少有 2 个节点。
本题与 783 https://leetcode-cn.com/problems/minimum-distance-between-bst-nodes/ 相同
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-absolute-difference-in-bst
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题目的意思比较明确,就是需要求最小的二叉搜索树任意节点之间的最小差值。仔细思考一下会发现,最小绝对差值,其实二叉搜索树的特性就是有序的,所以可以知道与自己差值最小的不是在自己前面就是在自己后面,由此特性可以得到使用有序的中序遍历可以获取到当前最小差值计算。
2. 参考中序遍历
中序遍历的题目一般是将当前的二叉树按照中序遍历模样,利用list存储即可。所以使用递归的话可以很简单实现,使用迭代的话需要手动给节点置null
,防止二次放入数据。
这里的话主要是为了获取root.val
的值,其实绝对值不绝对值都无所谓,因为二叉树的有序性。所以计算的结果一定不会为负数。
3. 代码解决
/**
* @author caoduanxi
* @Date 2020/10/12 8:38
* @Motto Keep thinking, keep coding!
* leetcode 530、二叉搜索树的最小绝对差
* 即求解二叉树中任意两个节点的差的绝对值的最小值:注意是任意节点
* 不过有前提 二叉搜索树
*/
public class Leetcode530_GetMinimumDifferenceTreeNode {
int min = Integer.MAX_VALUE;
int preVal = -1;
public int getMinimumDifference(TreeNode root) {
if (root == null) return 0;
getMin(root);
return min;
}
private void getMin(TreeNode root) {
// 左中右 中间是处理环节
if (root == null) return;
getMin(root.left);
// 主要是一个初始值的位置的限定
if (preVal != -1) {
min = Math.min(root.val - preVal, min);
}
// 这里注意赋值,否则计算不连续
preVal = root.val;
getMin(root.right);
}
}
上述代码中利用preVal
记录前一个值,保证计算的连续性,这样的话利用变量来作为桥梁可以解决问题,但是主要,对于初始值的preVal
需要注意,在最开始的时候我们遍历到最后,如果发现初始值未变化,则表示此时到达了第一个非null
的节点,从后面开始可以参与计算了。
4. 小结
这道题最开始知道是中序遍历,但是一直没有想到出现第一个值之后怎么规避自己与之前的数相减,后面发现只需要利用变量来记录即可,所以有些时候的没有思路不是真的没有思路而是自己的思路出现了问题,需要及时纠正,否则浪费了时间也不知道自己错在了哪里!
还是需要开拓思维,继续学习,继续锻炼自己的思维转变能力!加油!
Keep thinking, keep coding! 写于南京 2020-10-12