主页 > IT业界  > 

LeetCode501.二叉搜索树中的众数

LeetCode501.二叉搜索树中的众数
题目描述

给你一个含重复值的二叉搜索树(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 = None self.result = [] def searchBST(self, cur): if cur is None: return self.searchBST(cur.left) # 左 # 中 if self.pre is None: # 第一个节点 self.count = 1 elif self.pre.val == cur.val: # 与前一个节点数值相同 self.count += 1 else: # 与前一个节点数值不同 self.count = 1 self.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) # 右 return def findMode(self, root: Optional[TreeNode]) -> List[int]: self.searchBST(root) return self.result 需要注意的地方

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

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

标签:

LeetCode501.二叉搜索树中的众数由讯客互联IT业界栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“LeetCode501.二叉搜索树中的众数