持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第16天,点击查看活动详情
一、题目描述:
给你一个含重复值的二叉搜索树(BST)的根节点 root ,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。
如果树中有不止一个众数,可以按 任意顺序 返回。
假定 BST 满足如下定义:
- 结点左子树中所含节点的值 小于等于 当前节点的值
- 结点右子树中所含节点的值 大于等于 当前节点的值
- 左子树和右子树都是二叉搜索树
示例 1:
输入:root = [1,null,2,2]
输出:[2]
示例 2:
输入:root = [0]
输出:[0]
提示:
- 树中节点的数目在范围 [1, 10^4] 内
- -10^5 <= Node.val <= 10^5
进阶:你可以不使用额外的空间吗?(假设由递归产生的隐式调用栈的开销不被计算在内)
二、思路分析:
一次遍历,按照中序遍历,就是相当于遍历不减数组,记录下前驱,如果本值与前驱的值相同,那么current++;表示包括自己已经有了这么多为值为root.val的结点;不然current变为1,表示自己这个值第一次出现。
在遍历到一个节点后,不断的更新当前出现过的mostCount(众数出现的次数),因为众数不止一个,所以在current==mostCount时候,加入到列表中,然后要是current大于了mostCount证明新的众数出现了,然后就将之前的全部清空,将自己加入
三、AC 代码:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
TreeNode pre = null;
int mostCount = 0;
int current = 0;
LinkedList<Integer> ll = new LinkedList<Integer>();
public int[] findMode(TreeNode root) {
inOrder(root);
int[] res = new int[ll.size()];
for(int i = 0;i < ll.size();i++){
res[i] = ll.get(i);
}
return res;
}
void inOrder(TreeNode root){
//统计出出现了多少次才算众数
if(root == null)return ;
inOrder(root.left);
if(pre == null){
pre = root;
mostCount = 1;
current = 1;
ll.add(root.val);
}else{
if(pre.val == root.val){
current++;
if(current == mostCount){
ll.add(root.val);
}else if(current > mostCount){
ll.clear();
ll.add(root.val);
mostCount = current;
}
}else{
current = 1;
if(current == mostCount){
ll.add(root.val);
}
}
pre = root;
}
inOrder(root.right);
}
}