给你一棵所有节点为非负值的二叉搜索树,请你计算树中任意两节点的差的绝对值的最小值。

    示例:

    输入:
    1
    \
    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

    思路:
    中序遍历二叉搜索树可得到按从小到大顺序排列的数组,比较数组中相邻元素的绝对差,可获得答案。
    这里我用了mirrors遍历法,可减少空间复杂度,mirrors的原理不再赘述,可参考之前的题解:
    94.二叉树的中序遍历——medium

    复杂度分析:
    时间复杂度O(n)
    空间复杂度O(1)

    1. var minDiffInBST = function (root) {
    2. let pre;
    3. let ans = Infinity;
    4. let preVal = Infinity;
    5. while (root) {
    6. if (root.left) {
    7. pre = root.left;
    8. while (pre.right && pre.right !== root) {
    9. pre = pre.right;
    10. }
    11. if (!pre.right) {
    12. pre.right = root;
    13. root = root.left;
    14. } else {
    15. ans = Math.min(ans, Math.abs(root.val - preVal));
    16. preVal = root.val;
    17. pre.right = null;
    18. root = root.right;
    19. }
    20. } else {
    21. ans = Math.min(ans, Math.abs(root.val - preVal));
    22. preVal = root.val;
    23. root = root.right;
    24. }
    25. }
    26. return ans;
    27. };