目录
二叉搜索树中的众数
描述
给定一个有相同值的二叉搜索树(BST),找出 BST 中的所有众数(出现频率最高的元素)。
假定 BST 有如下定义:
- 结点左子树中所含结点的值小于等于当前结点的值
- 结点右子树中所含结点的值大于等于当前结点的值
- 左子树和右子树都是二叉搜索树
示例
给定 BST [1,null,2,2],
1 \ 2 / 2
返回[2]
提示:如果众数超过1个,不需考虑输出顺序
进阶:你可以不使用额外的空间吗?(假设由递归产生的隐式调用栈的开销不被计算在内)
方法:中序遍历+递归
我们可以中序遍历得到一个升序的数组,然后遍历这个数组查找相邻位置的数是否相同,即可完成查找众数的操作。
class Solution {
public List<Integer> res=new ArrayList<>();
public int len,pre,maxlen;
public int[] findMode(TreeNode root) {
dfs(root);//中序遍历二叉树
return res.stream().mapToInt(Integer::valueOf).toArray();
}
public void dfs(TreeNode root){//中序遍历得到升序数组
if(root==null) return;
dfs(root.left);//递归遍历左子树
update(root.val);//更新当前的众数
dfs(root.right);//递归遍历右子树
}
public void update(int cur){
if (cur==pre){//如果当前元素和上一个元素相同
len++;//长度自增
}else{
len=1;//重置长度
pre=cur;//更新pre
}
if (len==maxlen) res.add(pre);//如果长度与最大值相等,则将当前元素加入res
if (len>maxlen){
maxlen=len;//更新最大长度
res.clear();//清空之前的结果
res.add(pre);//将当前元素加入res结果列表
}
}
}