二叉树力扣刷题(5)501. 二叉搜索树中的众数

103 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第6天,点击查看活动详情

题目

501. 二叉搜索树中的众数

难度简单467

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

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

假定 BST 满足如下定义:

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

 

示例 1:

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

示例 2:

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

 

提示:

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

 

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

思路一

1.用map来计算二叉树值出现的频率

2.然后对map进行排序

3.遍历map数组找出和最大出现频率一致的值

代码一

class Solution {
public:
    //用map统计频率
    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;
    }
    //对map的排序
    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;
        if (root == nullptr) return 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);
            else break;
        }return result;
    }
};

思路二.

因为是二叉搜索树,在中序遍历的同时相邻的两个元素作比较,然后输出频率最高的元素 那么不用map如何输出频率最高的元素呢,pre(前指针)cur(后指针)

代码二.

class Solution {
public:
    int maxcount;             //最大频率
    int count;                //更新频率
    TreeNode*pre;
    vector<int> result;
    void searchBST(TreeNode*cur) {
        if (cur == nullptr) return;
        searchBST(cur->left);
        if (pre == nullptr) count = 1;     //第一个节点出现的频率为1
        else if (pre->val == cur->val) count++;
        else count = 1;
        pre = cur;                           //更新节点
        
        if (count == maxcount) result.push_back(cur->val);
        if (count > maxcount) {
        maxcount = count; 
        result.clear();                     //很关键的一步,因为时时都会出现新的频率的更新所以当有高一点的频率时,便更新之前的值。
        result.push_back(cur->val); 
        }

        searchBST(cur->right);
        return;
    }
    vector<int> findMode(TreeNode* root) {
        count = 0;
        maxcount = 0;
        TreeNode*pre = nullptr;
        searchBST(root);
        return result;
    }
};