【二叉树】二叉搜索树中的众数(leetcode501)
【摘要】 一、题目
给定一个有相同值的二叉搜索树(BST),找出 BST 中的所有众数(出现频率最高的元素)。
假定 BST 有如下定义:
结点左子树中所含结点的值小于等于当前结点的值
结点右子树中所含结点的值大于等于当前结点的值
左子树和右子树都是二叉搜索树
1234567
二、 题解
根据二叉搜索树的性质可知,二叉搜索树的中序遍历序列是一个非递减的有序序列。所以...
一、题目
给定一个有相同值的二叉搜索树(BST),找出 BST 中的所有众数(出现频率最高的元素)。
假定 BST 有如下定义:
结点左子树中所含结点的值小于等于当前结点的值
结点右子树中所含结点的值大于等于当前结点的值
左子树和右子树都是二叉搜索树
二、 题解
根据二叉搜索树的性质可知,二叉搜索树的中序遍历序列是一个非递减的有序序列。所以对于中序遍历序列,重复的数一定是连续出现的。因此,本题我们可以进行如下处理:
- 顺序扫描中序遍历序列,用 base 记录当前的数字,用 count 记录当前数字重复的次数。
- 用 maxCount 来维护已经扫描过的数当中出现最多的那个数字的出现次数,用 answer 数组记录出现的众数。
可以把这个过程写成一个update 函数,这样我们在寻找出现次数最多的数字的时候就可以省去一个哈希表带来的空间消耗。
三、实现
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public: vector<int> answer; int base, count, maxCount; void update(int x) { if(x==base) { count += 1; } else { //如果数是新的,则count置1,base变为此数x count = 1; base = x; } if(count==maxCount) { answer.push_back(base); } if(count>maxCount) { maxCount=count; answer = vector<int> {base}; //如果计数超过之前的数,则将answer覆盖 } } void dfs(TreeNode* node) { if(!node) return; //迭代必须有终止条件 dfs(node->left); update(node->val); dfs(node->right); } vector<int> findMode(TreeNode* root) { dfs(root); return answer; }
};
提交结果:
文章来源: ai-wx.blog.csdn.net,作者:AI 菌,版权归原作者所有,如需转载,请联系作者。
原文链接:ai-wx.blog.csdn.net/article/details/118560127
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
作者其他文章
评论(0)