需求
简单来说就是求众数,众数就是出现频率最高的数。以下是详细介绍,如果看懂了这句话下边就不用看了。
给你一个含重复值的二叉搜索树(BST)的根节点 root
,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。
如果树中有不止一个众数,可以按 任意顺序 返回。
假定 BST 满足如下定义:
- 结点左子树中所含节点的值 小于等于 当前节点的值
- 结点右子树中所含节点的值 大于等于 当前节点的值
- 左子树和右子树都是二叉搜索树
示例 1:
输入:root = [1,null,2,2]
输出:[2]
示例 2:
输入:root = [0]
输出:[0]
** 返回。
思路
既然是搜索树,它中序遍历就是有序的
这里我们使用双指针的方式,上一个元素与当前元素对比,对比数值相等对count++。
本次循环中会与maxCount进行对比如果更新maxCount与result。
搜索二叉树
/**
* 501. 二叉搜索树中的众数
*
*/
public class FindMode501 {
// 二叉搜索树遍历一定使用中序遍历
// 中序遍历结果为单调递增的。
public int[] findMode(TreeNode root) {
ArrayList<Integer> result = new ArrayList();
traversal(root,result);
return result.stream().mapToInt(Integer::intValue).toArray();
}
int maxCount = 0;
int count =0;
TreeNode preNode = null;
private void traversal(TreeNode root, ArrayList result){
if(root == null) return ;
//左
traversal(root.left,result);
// 中
if(preNode ==null){
count = 1;
}else if(preNode.val == root.val){
count++;
}else {
count=1;
}
preNode = root;
if(count == maxCount){
result.add(root.val);
}else if(count>maxCount){
maxCount = count;
result.clear();
result.add(root.val);
}
// 右
traversal(root.right,result);
}
}
验证结果