⼆叉搜索树中的众数
如果不是⼆叉搜索树
如果不是⼆叉搜索树,最直观的⽅法⼀定是把这个树都遍历了,⽤map统计频率,把频率排个序,最后取前⾯⾼频
的元素的集合。
是⼆叉搜索树
既然是搜索树,它中序遍历就是有序的。
思路
弄⼀个指针指向前⼀个节点,这样每次cur(当前节点)才能和pre(前⼀个节点)作⽐较。
⽽且初始化的时候pre = NULL,这样当pre为NULL时候,我们就知道这是⽐较的第⼀个元素。
class Solution {
int maxCount;//一个节点出现的最大频率
int count;//节点出现的频率
List<Integer> list = new ArrayList<>();
TreeNode pre;//指向前一个节点的指针
public int[] findMode(TreeNode root) {
process(root);
int[] res = new int[list.size()];
for(int i = 0; i < list.size(); i++){
res[i] = list.get(i);
}
return res;
}
public void process(TreeNode root){
if(root == null){
return;
}
process(root.left);//左
//中 中间处理逻辑
if(pre != null){
if(root.val == pre.val){
count++;
}else{
count=1;
}
}else{//pre == null说明是比较的第一个元素
count = 1;
}
pre = root;
if(count == maxCount){
list.add(root.val);
}
//当出现新的最大频率时,更新maxCount,此时还要清空list
if(count > maxCount){
maxCount = count;
list.clear();
list.add(root.val);
}
process(root.right);
}
}