[leetCode]530. 二叉搜索树的最小绝对差

题目

链接:https://leetcode-cn.com/problems/minimum-absolute-difference-in-bst

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

示例:

输入:

   1
    \
     3
    /
   2

输出:
1

解释:
最小绝对差为 1,其中 2 和 1 的差的绝对值为 1(或者 2 和 3)。

提示:
树中至少有 2 个节点。

递归

二叉搜索树是有序的,其中序遍历是一个有序数组,如果求一个有序数组的最小差值就很容易。因此可以将二叉搜索树转化为有序数组后再求最小的差值。但其实在遍历二叉树时通过一个变量记录前一个节点就能在遍历时计算差值并不断更新。

class Solution {
    private int minValue = Integer.MAX_VALUE;

    private TreeNode pre = null;

    public int getMinimumDifference(TreeNode root) {
        traversal(root);
        return minValue;
    }

    private void traversal(TreeNode cur) {
        if (cur == null) return;
        traversal(cur.left);
        if (pre != null) {
            minValue = Math.min(minValue, cur.val - pre.val);
        }
        pre = cur;
        traversal(cur.right);
    }
}

迭代

使用栈来模拟中序遍历的过程.

class Solution {
    public int getMinimumDifference(TreeNode root) {
        int minValue = Integer.MAX_VALUE; 
        TreeNode cur = root;
        TreeNode pre = null;
        LinkedList<TreeNode> stack = new LinkedList<>();
        while (cur != null || !stack.isEmpty()) {
            if (cur != null) {
                stack.push(cur); // 左 
                cur = cur.left;
            } else {
                cur = stack.pop(); // 中
                if (pre != null) {
                    minValue = Math.min(minValue, cur.val - pre.val);
                }
                pre = cur;
                cur = cur.right; // 右
            }
        }
        return minValue;
    }
}

你可能感兴趣的:(LeetCode,#,二叉树)