• 501. 二叉搜索树中的众数 递归法,拓展:普通二叉树求众数


    给你一个含重复值的二叉搜索树(BST)的根节点 root ,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。

    如果树中有不止一个众数,可以按 任意顺序 返回。

    假定 BST 满足如下定义:

    • 结点左子树中所含节点的值 小于等于 当前节点的值
    • 结点右子树中所含节点的值 大于等于 当前节点的值
    • 左子树和右子树都是二叉搜索树

    示例 1:

    输入:root = [1,null,2,2]
    输出:[2]
    

    示例 2:

    输入:root = [0]
    输出:[0]
    

    提示:

    • 树中节点的数目在范围 [1, 104]
    • -105 <= Node.val <= 105

    进阶:你可以不使用额外的空间吗?(假设由递归产生的隐式调用栈的开销不被计算在内)

     法一:若为普通二叉树,并不是二叉搜索树的做法:采用unordered_map

    1. /**
    2. * Definition for a binary tree node.
    3. * struct TreeNode {
    4. * int val;
    5. * TreeNode *left;
    6. * TreeNode *right;
    7. * TreeNode() : val(0), left(nullptr), right(nullptr) {}
    8. * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
    9. * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
    10. * };
    11. */
    12. class Solution {
    13. private:
    14. bool static cmp(const pair<int,int>& a,const pair<int,int>& b){
    15. return a.second>b.second;
    16. }
    17. void inorder(TreeNode* root,unordered_map<int,int>& res){
    18. if(root){
    19. inorder(root->left,res);
    20. res[root->val]++;
    21. inorder(root->right,res);
    22. }
    23. }
    24. public:
    25. vector<int> findMode(TreeNode* root) {
    26. vector<int> ans;
    27. if(!root) return ans;
    28. unordered_map<int,int> res;
    29. inorder(root,res);
    30. vectorint,int>> vec(res.begin(),res.end());
    31. sort(vec.begin(),vec.end(),cmp);
    32. ans.push_back(vec[0].first);
    33. for(int i=1;isize();i++){
    34. if(vec[i].second==vec[0].second){
    35. ans.push_back(vec[i].first);
    36. }
    37. }
    38. return ans;
    39. }
    40. };

    法二:利用二叉搜索树的特性,采用递归法

    1. /**
    2. * Definition for a binary tree node.
    3. * struct TreeNode {
    4. * int val;
    5. * TreeNode *left;
    6. * TreeNode *right;
    7. * TreeNode() : val(0), left(nullptr), right(nullptr) {}
    8. * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
    9. * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
    10. * };
    11. */
    12. class Solution {
    13. private:
    14. TreeNode* pre;
    15. int maxCount=INT_MIN;
    16. int count=0;
    17. void recursion(TreeNode* root,vector<int>& res){
    18. if(root){
    19. recursion(root->left,res);
    20. if(pre==NULL){
    21. count=1;
    22. }else if(pre->val==root->val){
    23. count++;
    24. }else{
    25. count=1;
    26. }
    27. if(maxCount==count){
    28. res.push_back(root->val);
    29. }
    30. else if(maxCount
    31. res.clear();
    32. res.push_back(root->val);
    33. maxCount=count;
    34. }
    35. pre=root;
    36. recursion(root->right,res);
    37. }
    38. }
    39. public:
    40. vector<int> findMode(TreeNode* root) {
    41. vector<int> ans;
    42. recursion(root,ans);
    43. return ans;
    44. }
    45. };

     参考代码:

    代码随想录

  • 相关阅读:
    Python装饰器实例讲解(三)
    APP开发的方式
    基于SSH开发企业内部邮件系统
    SpringCloud Alibaba微服务实战一 - 基础环境准备
    uni-app华为审核被拒,驳回原因:您的应用在运行时,未见向用户告知权限申请的目的
    基于Skywalking的全链路跟踪实现
    哈希表的介绍和内存布局 [数据结构][Java]
    Mysql易错知识点整理(待更新)
    read/write函数的应用
    React-路由导航
  • 原文地址:https://blog.csdn.net/qq_39993896/article/details/128186999