501.二叉搜索树中的众数
一、题目描述
给你一个含重复值的二叉搜索树(BST)的根节点 root ,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。
如果树中有不止一个众数,可以按 任意顺序 返回。
假定 BST 满足如下定义:
- 结点左子树中所含节点的值 小于等于 当前节点的值
- 结点右子树中所含节点的值 大于等于 当前节点的值
- 左子树和右子树都是二叉搜索树
例如:
给定 BST [1,null,2,2],
返回[2]。
提示:
- 二叉树的节点个数的范围是 [1,10^4]
- -10^5 <= Node.val <= 10^5
二、解题思路
根据二叉搜索树的特性,其中序遍历序列是一个非递减序列,以此可以很方便地做统计。
递归法
因为要求最大频率的元素集合(注意是集合,不是一个元素,可以有多个众数),可以这么做:
if (maxCount < count) {
list.clear();
list.add(root.val);
maxCount = count;
} else if (count == maxCount) {
list.add(root.val);
}
三、AC代码
递归法
class Solution {
ArrayList<Integer> list;
int count;
int maxCount;
int tmp = 100001;
public int[] findMode(TreeNode root) {
count = 0;
maxCount = 0;
list = new ArrayList<>();
findMode1(root);
int[] res = new int[list.size()];
for (int i = 0; i < list.size(); i++) {
res[i] = list.get(i);
}
return res;
}
void findMode1(TreeNode root) {
if (root == null) {
return ;
}
findMode1(root.left);
if (tmp == root.val) {
count++;
} else {
count = 1;
}
if (maxCount < count) {
list.clear();
list.add(root.val);
maxCount = count;
} else if (count == maxCount) {
list.add(root.val);
}
tmp = root.val;
findMode1(root.right);
}
}
参考代码随想录:https://programmercarl.com/