501

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

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

假定 BST 满足如下定义:

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

示例 1:

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

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

提示:

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

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

class Solution {
public:
    vector<int> nums;
    void travelsal(TreeNode *cur, unordered_map<int, int> umap) {
        if(cur == nullptr) {
            return;
        }
        travelsal(cur -> left, umap);
        // nums.push_back(cur -> val);
        umap[cur -> val]++;
        travelsal(cur -> right, umap);
    }
    bool static cmp(const pair<int, int>& a, const pair<int, int>& b) {
        return a.second > b.second;
    }
    vector<int> findMode(TreeNode* root) {
        vector<int> result;
        if(root == nullptr) {
            return result;
        }
        unordered_map<int, int> umap;
        travelsal(root, umap);
        vector<pair<int, int>> u(umap.begin(), umap.end());
        sort(u.begin(), u.end(), cmp);
        int maxCount = u[0].second;
        result.push_back(u[0].first);
        for(int i = 1; i < u.size(); i++) {
            if(u[i].second == maxCount) {
                result.push_back(u[i].first);
            }
            
        }
        return result;
    }
};
class Solution {
public:
    int maxCount;
    int count;
    TreeNode *pre = nullptr;
    void searchBST(TreeNode *cur, vector<int>& result) {
        if(cur == nullptr) {
            return;
        }
        searchBST(cur -> left, result);
        if(pre == nullptr) {
            count = 1;
        }else if(cur -> val == pre -> val) {
            count++;
        }else {
            count = 1;
        }
        if(count == maxCount) {
            result.push_back(cur -> val);
        }else if(count > maxCount) {
            maxCount = count;
            result.clear();
            result.push_back(cur -> val);
        }
        pre = cur;
        searchBST(cur -> right, result);
        return;
    }
    vector<int> findMode(TreeNode* root) {
        vector<int> result;
        maxCount = INT_MIN;
        count = 0;
        if(root == nullptr) {
            return result;
        }
        searchBST(root, result);
        return result;
    }
};
posted @ 2023-03-01 20:44  Travelever  阅读(125)  评论(0)    收藏  举报