首页 > 其他分享 >代码随想录day21 | 530.二叉搜索树的最小绝对差 501. 二叉搜索树中的众数 236. 二叉树的最近公共祖先

代码随想录day21 | 530.二叉搜索树的最小绝对差 501. 二叉搜索树中的众数 236. 二叉树的最近公共祖先

时间:2022-10-26 01:33:27浏览次数:88  
标签:count map TreeNode 复杂度 随想录 二叉 搜索 root 节点

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

题目|文章
image

思路

  1. 二叉搜索树的特点是按照中序遍历从小到大进行排列,因此,按照中序遍历,逐个比较即可找到最小差值
  2. 进行中序遍历,当前节点和前一个节点之间的差值小于最小差值时,对最小差值进行更新。

实现

点击查看代码
class Solution {
public:
    int getMinimumDifference(TreeNode* root) {
        traversal(root);
        return min;
    }
    int min = INT32_MAX;
    TreeNode* pre = nullptr;
    void traversal(TreeNode* root){
        if(root->left) traversal(root->left);
        if(pre != nullptr) min = (root->val - pre->val) < min ? (root->val - pre->val) : min; 
        pre = root;
        if(root->right) traversal(root->right);
    }
};

复杂度分析

  • 时间复杂度:O(n),对每一个节点都要进行遍历
  • 空间复杂度:O(n),当二叉搜索树为链表时,空间复杂度为n

501.二叉搜索树中的众数

题目|文章
image

1.二叉树中的众数

思路

1.通过map对二叉树的每个数字进行记录,key为值,value为出现的次数
2.map的比较只能比较key值,但不能比较value值,因此,需要重新构造比较函数比较value值。
3.建立一个vector,对map中的键值对进行排序
4.将value最大的key加入到结果中。

实现

点击查看代码
class Solution {
public:
    vector<int> findMode(TreeNode* root) {
        unordered_map<int, int> map;
        traversal(root, map);
        vector<pair<int,int>> vec(map.begin(), map.end());
        sort(vec.begin(), vec.end(), cmp);
        vector<int> result;
        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);
            else break;
        }
        return result;
    }
    void traversal(TreeNode* root, unordered_map<int,int>& map) {
        if(root == nullptr) return;
        map[root->val]++;
        traversal(root->left, map);
        traversal(root->right, map);
    }
    bool static cmp(const pair<int,int>& a, const pair<int, int>& b) {
        return a.second > b.second;
    }
    
    
};

复杂度分析

  • 时间复杂度:O(n+logn),先对二叉树进行遍历,再对结果进行排序
  • 空间复杂度:O(n)

2.二叉搜索树的众数

思路

1.利用二叉搜索树的特性进行简化,对出现的的次数进行计数。

  • 如果前节点为空,count = 1
  • 如果前节点和当前节点的值相等,count++
  • 如果前节点和当前节点的值不同,count = 1

2.将count值与max_count值进行比较

  • 如果相等,将当前节点的值加入结果
  • 如果大于max_count,更新max_count,清空结果,将当前节点的值加入结果中

实现

点击查看代码
class Solution {
public:
    vector<int> findMode(TreeNode* root) {
        result.clear();
        traversal(root);
        return result;
    }
    int max_count = 0;
    TreeNode* pre = nullptr;
    int count = 0;
    vector<int> result;
    void traversal(TreeNode* root){
        if(root == nullptr) return;
        traversal(root->left);
        if(pre == nullptr){
            count = 1;
        }
        else if(pre->val == root->val){
            count++;
        }
        else if(pre->val != root->val){
            count = 1;
        }
        pre = root;
        if(count == max_count){
            result.push_back(root->val);
        }
        else if(count > max_count){
            result.clear();
            max_count = count;
            result.push_back(root->val);
        }
        traversal(root->right);
    }
};

复杂度分析

  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

236. 二叉树的最近公共祖先

题目|文章
image

思路

因为要先处理子节点,因此使用后序遍历是正确的遍历顺序。

  1. 确定参数和返回值

  2. 确定终止条件。当遍历到节点为空或者节点为p或q时,返回当前节点。

  3. 确定单层循环逻辑。对于左子树和右子树返回值的不同情况进行处理。

  • 当左右子树都不是空时,当前节点就是最小公共祖先,返回当前节点。
  • 当左子树为空时,返回右子树,当右子树为空时,返回左子树
  • 当左右子树都为空时,返回空节点。

实现

点击查看代码
class Solution {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        if(root == NULL) return root;
        if(root == p || root == q) return root;
        TreeNode* left = lowestCommonAncestor(root->left, p, q);
        TreeNode* right = lowestCommonAncestor(root->right,p , q);
        if(left != NULL && right != NULL) return root;
        else if(left == NULL && right != NULL) return right;
        else if(left != NULL && right == NULL) return left;
        else return NULL;   
    }
};

复杂度分析

  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

标签:count,map,TreeNode,复杂度,随想录,二叉,搜索,root,节点
From: https://www.cnblogs.com/suodi/p/16826971.html

相关文章

  • JavaScript实现 -- 顺序搜索
    顺序搜索顺序搜索是一种寻找某一特定值的搜索算法,按一定的顺序检查数组中每一个元素,直到找到所要寻找的特定值为止。顺序搜索是最简单的一种搜索算法。思路遍历数组,并对......
  • 固定JetBrains的搜索窗口大小(Restore Default Layout)
     1.快捷键Ctrl+Alt+F调出搜索框2.自由调整搜索窗口的大小(可使用Ctrl+Alt+Shift+方向键来调整窗口大小)3.最左上方栏中的倒数第二个Window→点击 StoreC......
  • 剑指 Offer 37. 序列化二叉树 - 力扣(LeetCode)
    剑指Offer37.序列化二叉树-力扣(LeetCode)题目大意:将一棵二叉树序列化成字符串,然后通过该字符串可以重新构造出二叉树思路:看到将二叉树转化成字符串,首先想到的......
  • 算法】字符串复原IP地址,从前序与中序编辑序列构造二叉树
    算法学习有些时候是枯燥的,一点一点学习算法第一题算法题目描述对给定的两个日期之间的日期进行遍历,比如startTime是2014-07-11;endTime是2014-08-11如何把他们之间......
  • 已知后序和中序输出前序(二叉树)
    已知后序和中序输出前序(二叉树)给出二叉树的后序遍历和中序遍历,要求输出二叉树的前序遍历:后序:2315764中序:1234567分析:由后序遍历的特性可知,后序的最后一个......
  • python实现二叉树并且遍历
    python实现二叉树并且遍历2.1二叉树的遍历2.1.1前序遍历(根左右)二叉树的前序遍历的步骤如下:访问树的根节点---->访问当前节点的左子树---->若当前节点无左子树,访......
  • 对象存储只能按文件名搜索,你out了吧
    摘要:不少大公司的一个桶里都是几亿几十亿的对象,那他们都是怎么检索的呢?本文分享自华为云社区《对象存储只能按文件名搜索?用DWR+ElasticSearch实现文件名、文件内容、......
  • 关于存储二叉树
    !前置芝士:二叉树的性质\(1.\)二叉树中,第\(i\)层最多有\(2i-1\)个结点。\(2.\)如果二叉树的深度为\(K\),那么此二叉树最多有\(2K-1\)个结点。二叉树中,终端结点数(叶子结......
  • POJ 3278(BFS-搜索范围)
    这题是BFS水的主要是范围0<=n,k<=100000 但是有可能搜到200000……半天功夫才A.programP3278;constmaxn=200000;varn,k,i,j:longint;q,deep:array[1..maxn]of......
  • 代码随想录Day10
    LeetCode459重复字符串给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。示例1:输入:"abab"输......