当前位置: 首页 > news >正文

LeetCode 501.二叉搜索树中的众数

题目描述

给你一个含重复值的二叉搜索树(BST)的根节点 root ,找出并返回 BST 中的所有众数(即,出现频率最高的元素)。

如果树中有不止一个众数,可以按 任意顺序 返回。

假定 BST 满足如下定义:

  • 结点左子树中所含节点的值 小于等于 当前节点的值
  • 结点右子树中所含节点的值 大于等于 当前节点的值
  • 左子树和右子树都是二叉搜索树

示例 1:

输入:root = [1,null,2,2]
输出:[2]

示例 2:

输入:root = [0]
输出:[0]

提示:

  • 树中节点的数目在范围 [1, 10^4] 内
  • -10^5 <= Node.val <= 10^5

进阶:你可以不使用额外的空间吗?(假设由递归产生的隐式调用栈的开销不被计算在内)

思路

使用双指针遍历二叉树搜索树,统计元素出现频率,如果频率count等于maxCount(最大频率),把这个元素加入到结果集中;如果频率count大于maxCount,不仅要更新maxCount,而且要清空结果集。

代码

C++版:

/*** 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:// 递归法,中序遍历int maxCount = 0; // 最大频率int count = 0; // 统计频率TreeNode* pre = NULL;vector<int> result;void traversal(TreeNode * cur){if(cur==NULL) return;traversal(cur->left); // 左if(pre==NULL) count+=1;else if(pre->val==cur->val){ // 与前一个节点数值相同count++;}else{ // 与前一个节点数值不同count=1;}if(count>maxCount){ // 如果计数大于最大值频率maxCount=count; // 更新最大频率result.clear(); // 不要忘记清空result,之前result里的元素都失效了result.push_back(cur->val);}else if(count==maxCount){ // 如果和最大值相同,放进result中result.push_back(cur->val);}pre=cur; // 更新上一个节点traversal(cur->right); // 右return ;}vector<int> findMode(TreeNode* root) {traversal(root);return result;}
};

Python版:

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:def __init__(self):self.maxCount = 0  # 最大频率self.count = 0  # 统计频率self.pre = Noneself.result = []def searchBST(self, cur):if cur is None:returnself.searchBST(cur.left)  # 左# 中if self.pre is None:  # 第一个节点self.count = 1elif self.pre.val == cur.val:  # 与前一个节点数值相同self.count += 1else:  # 与前一个节点数值不同self.count = 1self.pre = cur  # 更新上一个节点if self.count == self.maxCount:  # 如果与最大值频率相同,放进result中self.result.append(cur.val)if self.count > self.maxCount:  # 如果计数大于最大值频率self.maxCount = self.count  # 更新最大频率self.result = [cur.val]  # 不要忘记清空result,之前result里的元素都失效了self.searchBST(cur.right)  # 右returndef findMode(self, root: Optional[TreeNode]) -> List[int]:self.searchBST(root)return self.result

需要注意的地方

1.二叉搜索树的相关题目,常用中序遍历。

2.如果本题不是二叉搜索树,可以把这个树都遍历了,用map统计频率,把频率排个序,最后取前面高频的元素的集合。

3.本题有一个技巧:适时清空结果集。


http://www.mrgr.cn/news/91914.html

相关文章:

  • uniapp h5端和app端 使用 turn.js
  • Spring面试题2
  • 【Linux网络】认识协议(TCP/UDP)、Mac/IP地址和端口号、网络字节序、socket套接字
  • 计算机网络面试知识点总结
  • CUDA跟Nvidia适配处理
  • c++:stack与deque
  • UE5中按钮圆角,设置边框
  • Navicat17详细安装教程(附最新版本安装包和补丁)2025最详细图文教程安装手册
  • 刺客信条 枭雄 画质设置以及【锁帧60帧】的办法
  • stm32单片机个人学习笔记16(SPI通信协议)
  • Web 自动化测试提速利器:Aqua 的 Web Inspector (检查器)使用详解
  • 安装可视化jar包部署平台JarManage
  • vue2.x 中父组件通过props向子组件传递数据详细解读
  • Typora软件(Markdown编辑器)详细安装教程(附补丁包)2025最详细图文教程安装手册
  • Qt程序退出相关资源释放问题
  • 输入搜索、分组展示选项、下拉选取,全局跳转页,el-select 实现 —— 后端数据处理代码,抛砖引玉展思路
  • 现场可以通过手机或者pad实时拍照上传到大屏幕的照片墙现场大屏电子照片墙功能
  • 黑马点评自学03
  • Typora的Github主题美化
  • 一篇搞懂vue3中如何使用ref、reactive实现响应式数据