给定一个有相同值的二叉搜索树(BST),找出 BST 中的所有众数(出现频率最高的元素)。
假定 BST 有如下定义:
结点左子树中所含结点的值小于等于当前结点的值
结点右子树中所含结点的值大于等于当前结点的值
左子树和右子树都是二叉搜索树
例如:
给定 BST [1,null,2,2]
1 \ 2 / 2
返回[2]
常规思路可以使用一个Map集合用来存储结点值和出现次数,然后取最大次数的数字放置在结果数组里即可,使用此思路可使用任何一种遍历方式。
不过既然是搜索二叉树,就可以利用他的中序遍历得到的结果数组是一个有序数组的特点求解。
方法是 使用一个maxCount变量记录某数字出现的最大次数,变量c用来记录当前数字出现的次数,如果当前数字出现的次数大于前面数字的最大次数,则清空结果数组并把此数字加入,然后把maxCount设置为当前值。pre变量用来记录上一个遍历到的结点值,用来判断当前节点值与上一结点值是否相同
class Solution {
List<Integer> res=new ArrayList<>();
int maxC=0;
int c=0;
int pre=Integer.MIN_VALUE;
public int[] findMode(TreeNode root) {
dfs(root);
int[] res2=new int[res.size()];
for(int i=0;i<res.size();i++){ //将List集合转为数组
res2[i]=res.get(i);
}
return res2;
}
public void dfs(TreeNode root){
if(root==null)
return;
dfs(root.left); //递归左子树
update(root.val);
dfs(root.right); //递归右子树
}
public void update(int i){
if(pre==i){ //如果与上一个值相等,则出现次数加一
c++;
}else{ //如果与上一个值不相等,则出现次数置为1,并设置pre
c=1;
pre=i;
}
if(c==maxC) //如果当前出现次数等于最大次数,则放置到结果数组里
res.add(i);
if(c>maxC){ //如果出现次数大于最大次数,重置最大次数,清空结果表
maxC=c;
res.clear();
res.add(i);
}
}
}
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-mode-in-binary-search-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。