1. 程式人生 > 實用技巧 >[leetCode]530. 二叉搜尋樹的最小絕對差

[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;
    }
}