【LeetCode-530 | 二叉搜索树的最小绝对差】_#include

#include <iostream>
#include <vector>
#include <queue>
#include <stack>
#include <algorithm>

using namespace std;

struct TreeNode
{
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode() : val(0), left(nullptr), right(nullptr) {}
    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
    TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
};

class Solution
{
public:
    vector<int> vec;

    // 中序遍历----递归法实现
    void Traversal(TreeNode *root)
    {
        if (root == nullptr)
            return;

        Traversal(root->left);
        vec.push_back(root->val);
        Traversal(root->right);

        return;
    }

    /*
        方法1:利用二叉搜索树的有序性,使用中序遍历将其转化成有序的数组;接着,在一个有序数组上求两个数最小差值即可
            PS:二叉搜索树上求什么最值,求差值之类的,都要思考一下二叉搜索树可是有序的,要利用好这一特点
    */
    int getMinimumDifference(TreeNode *root)
    {
        vec.clear();
        Traversal(root);
        if (vec.size() < 2)
            return 0;

        int result = INT_MAX;

        for (int i = 1; i < vec.size(); i++)
        {
            result = min(result, vec[i] - vec[i - 1]);
        }
        return result;
    }
};

/*
    方法2:不用预先将二叉搜索树转化成有序数组,在中序遍历过程中,直接计算二叉搜索树的最小绝对差,需要用一个pre节点来记录cur节点的前一个节点
*/
class Solution
{
private:
    int result = INT_MAX;
    TreeNode *pre = nullptr;

public:
    // 1.确定递归函数入参及返回值
    void Traversal(TreeNode *root)
    {
        // 2.确定递归终止条件
        if (root == nullptr)
            return;
        // 3.确定单层递归逻辑
        Traversal(root->left); // 左
        if (pre != nullptr)
        {
            result = min(result, root->val - pre->val); // 根
        }
        pre = root;             // pre用于记录当前节点的前一个节点
        Traversal(root->right); // 右
        return;
    }

    int getMinimumDifference(TreeNode *root)
    {
        Traversal(root);
        return result;
    }
};