二叉树:求搜索树中的众数
501.二叉搜索树中的众数给定一个有相同值的二叉搜索树(BST) , 找出 BST 中的所有众数(出现频率最高的元素) 。
假定 BST 有如下定义:
- 结点左子树中所含结点的值小于等于当前结点的值
- 结点右子树中所含结点的值大于等于当前结点的值
- 左子树和右子树都是二叉搜索树
给定 BST [1,null,2,2],
文章插图
返回[2].
提示:如果众数超过1个 , 不需考虑输出顺序
进阶:你可以不使用额外的空间吗?(假设由递归产生的隐式调用栈的开销不被计算在内)
思路这道题目呢 , 递归法我从两个维度来讲 。
首先如果不是二叉搜索树的话 , 应该怎么解题 , 是二叉搜索树 , 又应该如何解题 , 两种方式做一个比较 , 可以加深大家对二叉树的理解 。
递归法如果不是二叉搜索树【二叉树:求搜索树中的众数】如果不是二叉搜索树 , 最直观的方法一定是把这个树都遍历了 , 用map统计频率 , 把频率排个序 , 最后取前面高频的元素的集合 。
具体步骤如下:
- 这个树都遍历了 , 用map统计频率
这里采用前序遍历 , 代码如下:
// map key:元素 , value:出现频率void searchBST(TreeNode* cur, unordered_mapmap[cur->val]++; // 统计元素频率searchBST(cur->left, map);searchBST(cur->right, map);return ;}
- 把统计的出来的出现频率(即map中的value)排个序
所以要把map转化数组即vector , 再进行排序 , 当然vector里面放的也是pair
代码如下:
bool static cmp (const pair // 按照频率从大到小排序}vector> 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++) {// 取最高的放到result数组中if (vec[i].second == vec[0].second) result.push_back(vec[i].first);else break;}return result;
整体C++代码如下:class Solution {private:void searchBST(TreeNode* cur, unordered_mapmap[cur->val]++; // 统计元素频率searchBST(cur->left, map);searchBST(cur->right, map);return ;}bool static cmp (const pair}public:vector findMode(TreeNode* root) {unordered_map map; // key:元素 , value:出现频率vector result;if (root == NULL) return result;searchBST(root, map);vector> 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++) {// 取最高的放到result数组中if (vec[i].second == vec[0].second) result.push_back(vec[i].first);else break;}return result;}};
「所以如果本题没有说是二叉搜索树的话 , 那么就按照上面的思路写!」是二叉搜索树「既然是搜索树 , 它中序遍历就是有序的」 。
- Apple Fitness+播放列表现可在Apple Music搜索上找到
- 田伟院士:我眼中的医疗机器人
- Mozilla将默认禁用Firefox中的退格键以防止用户编辑数据丢失
- LG Stylo 7渲染图曝光:没有预想中的重大升级
- 平淡无奇中的暗自升级,2020年主板市场年终盘点
- 手机中的“哈曼卡顿”,小米11又有黑科技曝光
- 苹果正在研发的搜索引擎能干的过谷歌吗?
- 谷歌Project Zero披露了Windows中的严重安全漏洞
- 微信推出“微信豆”,可用于购买直播中的虚拟礼物,你会充值吗?
- 项目实战 | 记一次对某猥琐PHP后门的爆菊