【力扣-二叉树】17.二叉搜索树的最小绝对差

400 阅读2分钟

「这是我参与11月更文挑战的第20天,活动详情查看:2021最后一次更文挑战

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

题目描述

给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值 。

差值是一个正数,其数值等于两值之差的绝对值。

示例 1:

输入: root = [4,2,6,1,3]
输出: 1

示例 2:

输入: root = [1,0,48,null,null,12,49]
输出: 1

递归法

遇到在二叉搜索树上求最值,求差值之类的问题,都要考虑到二叉搜索树有序的,要充分利用好这一特点。利用中序遍历可以得到一个有序的递增数组,在通过数组来获得想要的值

  • 递归法1 : 中序递归遍历,使用数组存储每个节点的值。遍历数组,相邻的两个数作差,得到差值的最小值。
  • 递归法2 : 中序递归遍历,使用 pre 指针,指向当前遍历结点的前一个结点,在遍历的过程中计算最小差值。

递归法1

#define MAX_INT 65536

class Solution
{
public:
    int getMinimumDifference(TreeNode *root)
    {
        // 清空数组
        vec.clear();
        // 中序遍历,将节点的值加入到数组中
        traversal(root);
        int minDiff = MAX_INT;
        // 遍历数组,求出最小的差值
        for (int i = 1; i < vec.size(); i++)
        {
            if (vec[i] - vec[i - 1] < minDiff)
            {
                minDiff = vec[i] - vec[i - 1];
            }
        }
        return minDiff;
    }

private:
    // 定义全局数组,用来存储每个节点的值
    vector<int> vec;
    // 中序遍历数组
    void traversal(TreeNode *node)
    {
        if (node == NULL)
        {
            return;
        }
        // 左
        traversal(node->left);
        // 中
        vec.push_back(node->val);
        // 右
        traversal(node->right);
    }
};

递归法2

#define MAX_INT 65536

class Solution
{
private:
    // 记录最小的差值
    int result = MAX_INT;

    // 记录遍历结点的前一个结点
    TreeNode *pre;
    void traversal(TreeNode *cur)
    {
        if (cur == NULL)
        {
            return;
        }
        // 左
        traversal(cur->left);
        // 中
        if (pre != NULL)
        {
            result = min(result, cur->val - pre->val);
        }
        // 记录前一个结点
        pre = cur;
        // 右
        traversal(cur->right);
    }

public:
    int getMinimumDifference(TreeNode *root)
    {
        traversal(root);
        return result;
    }
};