代码随想录算法训练营第二十一天|530 二叉搜索树中的最小绝对差、501 二叉搜索树中的众数、236 二叉树的最近公共祖先

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

题目链接:二叉搜索树的最小绝对误差

思路

一种直白的思路是:采用中序遍历的方法将将二叉搜索树转为有序的数组,然后在数组中求取两个数的最小差值。

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);
    }
    int getMinimumDifference(TreeNode* root) {
   
        vec.clear();
        traversal(root);
        int result = INT_MAX;
        for(int i=1; i<vec.size(); i++){
   
            result = min(result, vec[i]-vec[i-1]);
        }
        return result;
    }
};

参考解析,还有一种递归时(中序遍历)使用双指针的方法也可以解决此问题,这样就没有额外数组的开销,降低了空间复杂度。

class Solution {
   
public:
    int result = INT_MAX;
    TreeNode* pre = nullptr;
    void traversal(TreeNode* root){
   
        if(root == nullptr) return;
        traversal(root->left);
        if(pre != nullptr){
   
            result = min(result, root->val-pre->val);
        }
        pre = root;
        traversal(root->right);
    }
    int getMinimumDifference(TreeNode* root) {
   
        traversal(root);
        return result;
    }
};

501 二叉搜索树中的众数

题目链接:二叉搜索树中的众数

思路

第一个直白的思路是:将这个二叉树遍历存到数组里,然后使用map统计元素的频率,取频率最高的元素。有个问题就是如何对map进行排序,我们知道mapkey可以是有序的,也可以是无序的,但这里我们的key存储的是元素,而val存储的是元素的频率,所以如何对这个map排序呢?参考解析,可以将map转为vector,然后使用sortvector进行排序,手写cmp函数。

class Solution {
   
public:
    void searchBST(TreeNode* cur, unordered_map<int, int>&map){
   
        if(cur==nullptr) return;
        map[cur->val]++;
        searchBST(cur->left, map);
        searchBST(cur->right, map);
        return;
    }
    bool static cmp(const pair<int,int> &a, const pair<int,int>&b){
   
        return a.second>b.second;
    }
    vector<int> findMode(TreeNode* root) {
   
        unordered_map<int, int> map;
        vector<int> result;
        searchBST(root, map);
        vector<pair<int,int>> vec(map.begin(), map.end());
        sort(vec.begin(), vec.end(), cmp);
        result.push_back(vec[0].first);
        for(int i=1; i<vec.size();i++){
   
            if(vec[i].second == vec[0].second){
   
                result.push_back(vec[i].first);
            }
        }
        return result;
    }
};

236 二叉树的最近公共祖先

题目链接:二叉树的最近公共祖先

思路

第一次看这道题目,没有明确的思路,参考解析,后面再好好研究。

class Solution {
   
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
   
       if (root == q || root == p || root == NULL) return root;
        TreeNode* left = lowestCommonAncestor(root->left, p, q);
        TreeNode* right = lowestCommonAncestor(root->right, p, q);
        if (left != NULL && right != NULL) return root;

        if (left == NULL && right != NULL) return right;
        else if (left != NULL && right == NULL) return left;
        else  {
    //  (left == NULL && right == NULL)
            return NULL;
        }  
    }
};

参考链接

  1. https://programmercarl.com/0236.%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E6%9C%80%E8%BF%91%E5%85%AC%E5%85%B1%E7%A5%96%E5%85%88.html#%E6%80%9D%E8%B7%AF

相关推荐

最近更新

  1. TCP协议是安全的吗?

    2024-02-01 18:58:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-02-01 18:58:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-02-01 18:58:01       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-02-01 18:58:01       20 阅读

热门阅读

  1. SQL分页写法

    2024-02-01 18:58:01       33 阅读
  2. 征集各位的意见

    2024-02-01 18:58:01       28 阅读
  3. 【风水】-- 家居风水四大注意事项

    2024-02-01 18:58:01       30 阅读
  4. MySQL执行顺序

    2024-02-01 18:58:01       41 阅读
  5. C++面试题

    2024-02-01 18:58:01       33 阅读
  6. 「HarmonyOS」EventHub事件通知详细使用方法

    2024-02-01 18:58:01       44 阅读
  7. 一篇文章了解正则表达式的替换技巧

    2024-02-01 18:58:01       33 阅读
  8. docker面试问题二

    2024-02-01 18:58:01       37 阅读
  9. 深入探讨 React 组件生命周期(旧版)

    2024-02-01 18:58:01       36 阅读