LeetCode 530. 二叉搜索树的最小绝对差 思考分析

208 阅读1分钟

目录

题目

给你一棵所有节点为非负值的二叉搜索树,请你计算树中任意两节点的差的绝对值的最小值。
在这里插入图片描述

思路1:递归遍历得到result数组(单调递增),然后对数组进行前后差分,取最小值

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    void traversal(TreeNode* cur , vector<int>& vec)
    {
        if(cur == NULL) return;
        traversal(cur->left,vec);
        vec.push_back(cur->val);
        traversal(cur->right,vec);
    }
    int getMinimumDifference(TreeNode* root) {
       vector<int> result;
        traversal(root,result);
        //递增序列,所以绝对值的最小值就在差分数组中
        int Minimum =INT_MAX;
        for(int i =1;i<result.size();i++)
        {
            Minimum = min(result[i]-result[i-1],Minimum);
        }
        return Minimum;
    }
};

不过这样的效率感觉比较低。

思路2:不用数组,进行优化

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    int Minimum =INT_MAX;   
    TreeNode* pre =NULL;        //用来记录前一个结点
    void traversal(TreeNode* cur)
    {
        if(cur == NULL) return;
        traversal(cur->left);
        if(pre != NULL ) Minimum = min(cur->val-pre->val,Minimum);
        pre = cur;  //更新结点
        traversal(cur->right);
    }
    int getMinimumDifference(TreeNode* root) {
        traversal(root);
        return Minimum;
    }
};

思路3、回顾迭代法求解

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:  
    int getMinimumDifference(TreeNode* root) {
        stack<TreeNode*> st;
        int Minimum =INT_MAX; 
        TreeNode* cur = root;
        TreeNode* pre = NULL;   
        while(!st.empty() || cur!=NULL)
        {
            if(cur!=NULL)
            {
                st.push(cur);
                cur = cur->left;
            }
            else
            {
                cur = st.top();
                st.pop();
                if(pre != NULL ) Minimum = min(cur->val-pre->val,Minimum);
                pre = cur;  //更新结点
                cur = cur->right;
            }
        } 
        return Minimum;
    }
};