二叉树力扣刷题(4)530. 二叉搜索树的最小绝对差

98 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第5天,点击查看活动详情

本文已参与[新人创作礼]活动,一起开启掘金创作之路

题目

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

难度简单347

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

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

 

示例 1:

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

示例 2:

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

 

提示:

  • 树中节点的数目范围是 [2, 104]
  • 0 <= Node.val <= 105

 

思路:

注意这是二叉搜索树,二叉搜索树是有序的。遇到二叉搜索树上求最值,求差值等问题,可以把它想成一个有序数组来求最值,求差值,这样就简单许多了

这里我们用前一个数减去后一个数求最小差值,本来可以用数组来代替,这里不用数组,数组增加了空间复杂度。

对二叉搜索树进行中序遍历的过程中,我们可以直接找到相邻两个节点的差值——用一个pre节点记录root节点的前一个节点。 pre代表前一个数.

代码1

class Solution {
public:
    int ans = 100000;                //最大差值 大于100000即可
    int pre = -9999;              //小于-9999即可
    
    vector<int> ret;
    void reversal(TreeNode*root) {
        if (root == nullptr ) return;
        reversal(root->left);       //左
        ans = min(ans, root->val - pre); 
        pre = root->val;
        reversal(root->right);   //右
    }
    int getMinimumDifference(TreeNode* root) {

        reversal(root);
        return ans;
    }
};

代码2

class Solution {
public:
    void dfs(TreeNode* root, int& pre, int& ans) {
        if (root == nullptr) {      //如果为空直接返回,表示这一层循环作废
            return;
        }
        dfs(root->left, pre, ans);  //左
        if (pre == -1) {
            pre = root->val;
        } else {
            ans = min(ans, root->val - pre);
            pre = root->val;
        }
        dfs(root->right, pre, ans);
    }
    int getMinimumDifference(TreeNode* root) {
        int ans = INT_MAX, pre = -1;    //注意这里的-1
        dfs(root, pre, ans);
        return ans;
    }
};