二叉搜索树中的众数501题目如下:
主要难点是如何在遍历的时候找到这个众数,而且这个众数可能不止一个,这个众数肯定会随着遍历不断变化,如何不开辟新的空间来找到。
思路:充分利用二叉搜索树的有序的特点,采用中序遍历,并同时利用前一个节点pre和当前节点root进行比较,由于搜索树的特性,这个众数也只会出现在pre和root上。在遍历的时候,还需要构建一个当前count和最大count-maxCount,以便实时更新最大频次,同时更新结果数组(如果当前的count大于之前的最大count-maxCount,需要将之前结果数组全部清空,然后存放最新的频次最高的节点元素)。代码如下:
class Solution {
//声明全局变量
ArrayList<Integer> resList;
int maxCount = 0;//之前元素的最大频率
int count = 0;//当前频率
TreeNode pre = null;//前一个节点
public int[] findMode(TreeNode root) {
resList = new ArrayList<>();
//得到最终遍历完整个树的众数数组
findMode1(root);
int[] res = new int[resList.size()];
//将resList转为最终的数组
for(int i = 0; i < resList.size(); i++){
res[i] = resList.get(i);
}
return res;
}
public void findMode1(TreeNode root){
//采用中序遍历,不断更新频率最大的数组
//1.递归的终止条件
if(root == null) return;
//2.遍历左子树
findMode1(root.left);
//3.判断条件,选择是否计数
int rootValue = root.val;
if(pre == null || pre.val != rootValue){
count = 1;
}else{
count++;
}
//4.更新结果和maxCount
if(count > maxCount){
resList.clear();
maxCount = count;
resList.add(rootValue);
}else if(count == maxCount){
resList.add(rootValue);
}
pre = root;
findMode1(root.right);
}
}