183.二叉树:二叉搜索树中的众数(力扣)
代码解决
/**
* 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:
TreeNode* pre = nullptr; // 用于记录前一个节点
int count = 0, maxCount = 0; // 当前节点值的计数和最大计数
vector result; // 记录出现次数最多的值
// 中序遍历函数
void traversal(TreeNode* node)
{
if(node == nullptr) return; // 如果当前节点为空,则返回
traversal(node->left); // 递归遍历左子树
// 处理当前节点
if(pre == nullptr)
{
count = 1; // 如果前一个节点为空,说明是第一个节点,计数设为1
}
else if(pre->val == node->val)
{
count++; // 如果当前节点值与前一个节点值相等,计数加1
}
else
{
count = 1; // 如果当前节点值与前一个节点值不等,重新计数
}
pre = node; // 更新前一个节点为当前节点
if(count == maxCount)
{
result.push_back(node->val); // 如果当前计数等于最大计数,加入结果
}
if(count > maxCount)
{
maxCount = count; // 如果当前计数大于最大计数,更新最大计数并清空结果重新加入
result.clear();
result.push_back(node->val);
}
traversal(node->right); // 递归遍历右子树
}
// 找到二叉搜索树中出现次数最多的值
vector findMode(TreeNode* root)
{
count = 0;
maxCount = 0;
pre = nullptr; // 重置前一个节点
result.clear();
traversal(root); // 开始中序遍历
return result;
}
};
- 定义三个全局变量 pre、count 和 maxCount,分别用于记录前一个节点、当前节点值的计数和最大计数。
- 定义一个全局变量 result 用于记录出现次数最多的值。
- 定义一个辅助函数 traversal,它接受当前节点作为参数。
- 如果当前节点为空,则返回。
- 递归地遍历左子树。
- 处理当前节点:
- 如果 pre 为空,说明是第一个节点,计数设为1。
- 如果当前节点值与 pre 节点值相等,计数加1。
- 如果当前节点值与 pre 节点值不等,重新计数。
- 更新 pre 为当前节点。
- 如果当前计数等于最大计数,加入结果向量。
- 如果当前计数大于最大计数,更新最大计数并清空结果向量,然后加入当前节点的值。
- 递归地遍历右子树。
- 在 findMode 函数中,重置计数和最大计数,清空结果向量,开始中序遍历,并返回结果向量。
这个算法的时间复杂度是 O(n),因为每个节点都会被访问一次,其中 n 是树中节点的数量。空间复杂度也是 O(n),因为需要存储递归调用的栈。
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

