主页 > 其他  > 

算法-二叉树篇20-二叉搜索树中的众数

算法-二叉树篇20-二叉搜索树中的众数
二叉搜索树中的众数

力扣题目链接

题目描述

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

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

假定 BST 满足如下定义:

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

解题思路

这道题其实可以直接中序遍历然后结合数组找出众数即可,我是利用前k个高频元素来做,麻烦一些,但是可扩展性高,同时复习一下unorder_map,sort等用法,过了几天有点忘记了。 详细思路可以看我之前的文章:算法-栈和队列篇05-前 K 个高频元素

题解 class Solution { public: static bool cmp(pair<int, int> x, pair<int, int> y){ return x.second > y.second; } vector<int> findMode(TreeNode* root) { vector<int> ans; if(!root){ return ans; } unordered_map<int, int> um;// 存储节点值和出现次数 stack<TreeNode*> st; TreeNode* cur = root; while(!st.empty() || cur != NULL){ if(cur != NULL){ st.push(cur); cur = cur->left; } else{ cur = st.top(); st.pop(); um[cur->val]++; cur = cur->right; } } // 对map排序,排序规则为按照出现次数 vector<pair<int, int>> arr(um.begin(), um.end()); sort(arr.begin(), arr.end(), cmp); // 最大的先放入答案数组中 ans.push_back(arr[0].first); for(int i = 1; i < arr.size(); i++){ // 循环判断前几个的出现次数是否相等,相等就加上 if(arr[i].second == arr[i - 1].second){ ans.push_back(arr[i].first); } else { break; } } return ans; } };
标签:

算法-二叉树篇20-二叉搜索树中的众数由讯客互联其他栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“算法-二叉树篇20-二叉搜索树中的众数