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

  • 递归1----不用数组
  • 递归2------借助数组
  • 迭代
class Solution {
public:
    TreeNode* pre = NULL;
    int result = INT_MAX;
    void traversal(TreeNode* root ) {
        if (root == NULL) return;
        traversal(root->left ); 
        if (pre != NULL) 
            result = min (result, (root->val - pre->val));
        pre = root;
        traversal(root->right );
    }
    int getMinimumDifference(TreeNode* root) {
        traversal(root );
        return result;
    }
};
  • 以上是 卡哥Ac
  • 我能想到这个思路 就是在上一个题目 0098验证二叉搜索树的 迭代版本--找树最左边结点为最小值 的基础上 只需要添加一个判断即可
    • 也就是说 可以再设置一个全局变量 result = INT_MAX 然后额外一个递归函数 在pre = root之前就进行比较较小值并赋值
    • 但是我写的代码 还是有差距的 我没有想到把result设置成全局变量 而是打算让result作为递归函数的输入参数 wa代码见下
class Solution {
public:
    TreeNode* pre = NULL;
    void traversal(TreeNode* root, int result) {
        if (root == NULL) return;
        traversal(root->left, result); 
        if (pre != NULL) 
            result = min (result, (root->val - pre->val));
        pre = root;
        traversal(root->right, result);
    }
    int getMinimumDifference(TreeNode* root) {
        int result = INT_MAX;
        traversal(root, result);
        return result;
    }
};
  • 无论什么测试用例 结果都是2147483647 应该是INT_MAX的值 也就是说 虽然进入traversal(root, result)函数 但是并没有对result的值进行修改 我猜测可能是因为值传递而地址传递的原因 目前还不会改正错误 下次再看

  • 递归2----借助数组

class Solution {
public:
    vector<int> vec;
    void traversal(TreeNode* root) {
        if (root == NULL) return;
        traversal(root->left); 
        vec.push_back(root->val); 
        traversal(root->right);
    }
    int getMinimumDifference(TreeNode* root) {
        int result = INT_MAX;
        traversal(root);
        if (vec.size() <= 1)    return 0;
        for (int i = 1; i < vec.size(); i++) {
            result = min(result, vec[i] - vec[i - 1]);
        }
        return result;
    }
};
  • !!!二叉搜索树 经过中序遍历 即得有序数组 将问题 求二叉搜索树的最值 转换为 求有序数组的最值 这个方法最直观最简单
  • 迭代法-----在0098验证二叉搜索树的 迭代版本基础上 加两行代码
class Solution {
public:
    int getMinimumDifference(TreeNode* root) {
        stack<TreeNode*> st;
        TreeNode* pre = NULL;
        TreeNode* cur = root;
        int result = INT_MAX;
        while (cur != NULL || !st.empty()) {
            if (cur != NULL) {
                st.push(cur);
                cur = cur->left;
            } else {
                cur = st.top();
                st.pop();
                if (pre != NULL) {
                    result = min(result, cur->val - pre->val);
                }
                pre = cur;
                cur = cur->right;
            }
        }
        return result;
    }
};
  • 迭代版本 虽然不是最直观的 但理解了模板的话是最好改的
posted @ 2022-12-31 21:39  跬步瑶  阅读(19)  评论(0)    收藏  举报