Skip to content

代码随想录 二叉树:二叉搜索树的最小绝对差

题目描述

给你一棵所有节点为非负值的二叉搜索树,请你计算树中任意两节点的差的绝对值的最小值。 示例: 530二叉搜索树的最小绝对差 提示:树中至少有 2 个节点。

题目链接:530

文章讲解:530

思考

在二叉搜索树上求什么最值啊,差值之类的,就把它想成在一个有序数组上求最值,求差值,这样就简单多了。要使用中序遍历记的。

在一个有序数组上求两个数最小差值,一直计算相邻两元素差值,不断更新,保持最小

那么可以使用pre指针指向相邻两元素的前一个元素,cur指针指向后一个元素。在树上就是pre为左子节点,cur为中节点。

cur是我们的遍历节点,我们不用手动移动。但是pre作为自指定的节点,必须要手动移动,pre节点记录cur节点的前一个节点。

将pre指定为一个全局变量,每次更新完将pre移动到cur上即可

代码实现

C++
class Solution {
public:
    int result = INT_MAX;
    TreeNode* pre;
    void traversal(TreeNode* root) {
        if (root == nullptr)
            return;
        traversal(root->left);
        if (pre != nullptr) {
            result =
                result < root->val - pre->val ? result : root->val - pre->val;
        }
        pre = root;
        traversal(root->right);
    }
    int getMinimumDifference(TreeNode* root) {
        traversal(root);
        return result;
    }
};