501. 二叉搜索树中的众数

Problem: 501. 二叉搜索树中的众数

Reference

https://www.programmercarl.com/0501.%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91%E4%B8%AD%E7%9A%84%E4%BC%97%E6%95%B0.html#%E7%AE%97%E6%B3%95%E5%85%AC%E5%BC%80%E8%AF%BE

思路

我们还是使用二叉搜索树的特性,中序遍历可以的到,有序的序列,于是我们使用中序遍历。

返回条件: 当前节点为nullptr。

需要保存的零时量有preNode 上一个节点 cnt 当前计数 maxVal最大计数,处理中间节点:

当为preNode == null 说明刚开始,前一个元素是nullptr,直接让计数置为1
preNode.val == cur.val时计数+1,
否则前一个元素和当前元素的值不相同,重置计数为1

处理完这一步,我们更新preNode。

处理完中间节点,判断当前计数与最大计数的关系,大于清空结果集再加入当前元素,因为他的计数比之前都要大。额如果等于则说明他于之前的众数一样多不用清空结果集,直接加入。

复杂度

时间复杂度:

添加时间复杂度, 示例: $O(n)$

空间复杂度:

添加空间复杂度, 示例: $O(n)$

Code

[]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
/**
* 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> res;
TreeNode* pre;
int cnt = 0;
int maxCnt = 0;
void traversal(TreeNode* node) {
if (node == nullptr)
return;
traversal(node->left);
if (pre == nullptr) {
cnt = 1;
} else if (node->val == pre->val) {
cnt++;
} else {
cnt = 1;
}
pre = node;
if (cnt >= maxCnt) {
if (cnt > maxCnt)
res.clear();
maxCnt = cnt;
res.push_back(node->val);
}
traversal(node->right);
}
vector<int> findMode(TreeNode* root) {
traversal(root);
return res;
}
};