501.二叉搜索树中的众数
思路
第一眼,中序遍历+哈希表找最大出现次数解题,暴力解法。需要中序遍历一遍+哈希表取最大值一遍+哈希表根据最大值找对应键一遍。复杂度3n。
后续,可根据二叉搜索树性质来解,在中序遍历时对前后两个相邻的节点值进行判断,若为一样则累加当前节点值的数量,与众数比较大小,判断是否替换将当前值入List。
值得注意的是:return list.stream().mapToInt(Integer::intValue).toArray();
将List转为int[]数组。
代码
public int[] findMode(TreeNode root) {
List<Integer> result=new ArrayList<>();
TreeNode cur=root;
TreeNode pre=null;
Stack<TreeNode> stack=new Stack<>();
int max=0;int num=0;
while (cur!=null || !stack.isEmpty()){
if (cur!=null){
stack.push(cur);
cur=cur.left;
}else {
cur=stack.pop();
if (pre==null || cur.val!= pre.val){
num=1;
}else {
num++;
}
if (num>max){
max=num;
result.clear();
result.add(cur.val);
}else if (num==max){
result.add(cur.val);
}
pre=cur;
cur=cur.right;
}
}
return result.stream().mapToInt(Integer::intValue).toArray();
}