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
|
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; } };
|