跟着carl学算法,本系列博客仅做个人记录,建议大家都去看carl本人的博客,写的真的很好的!
代码随想录
LeetCode:501.二叉搜索树中的众数
给你一个含重复值的二叉搜索树(BST)的根节点 root ,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。
如果树中有不止一个众数,可以按 任意顺序 返回。
假定 BST 满足如下定义:
结点左子树中所含节点的值 小于等于 当前节点的值
结点右子树中所含节点的值 大于等于 当前节点的值
左子树和右子树都是二叉搜索树
示例 1:
输入:root = [1,null,2,2]
输出:[2]
示例 2:
输入:root = [0]
输出:[0]
记录count
和maxCount
,如果count > maxCount
则更新maxCount
和res
,这样的话可以一次遍历就得出结果
TreeNode pre;
int count = 0;
int maxCount = 0;
List<Integer> res = new ArrayList<>();
public int[] findMode(TreeNode root) {
traversal(root);
// return res.stream().mapToInt(Integer::intValue).toArray();
// 下面这种方式返回在leetcode上感觉更快
int[] arr = new int[res.size()];
int index = 0;
for (int i : res) {
arr[index] = i;
index++;
}
return arr;
}
private void traversal(TreeNode cur) {
if (cur == null)
return;
// 左
traversal(cur.left);
// 中
if (pre == null || cur.val != pre.val) {
count = 1;
} else if (cur.val == pre.val) {
count++;
}
if (maxCount == count) {
res.add(cur.val);
} else if (count > maxCount) {
maxCount = count;
res.clear();
res.add(cur.val);
}
pre = cur;
// 右
traversal(cur.right);
}