您的位置:首页 > 教育 > 锐评 > 谁能给个网站谢谢_政府采购网上超市_关键词免费网站_广州官方新闻

谁能给个网站谢谢_政府采购网上超市_关键词免费网站_广州官方新闻

2025/2/22 22:59:44 来源:https://blog.csdn.net/weixin_50878507/article/details/145760722  浏览:    关键词:谁能给个网站谢谢_政府采购网上超市_关键词免费网站_广州官方新闻
谁能给个网站谢谢_政府采购网上超市_关键词免费网站_广州官方新闻

题目描述

给你一个含重复值的二叉搜索树(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.本题有一个技巧:适时清空结果集。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com