501. 二叉搜索树中的众数
难度简单
给你一个含重复值的二叉搜索树(BST)的根节点 root
,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。
如果树中有不止一个众数,可以按 任意顺序 返回。
假定 BST 满足如下定义:
- 结点左子树中所含节点的值 小于等于 当前节点的值
- 结点右子树中所含节点的值 大于等于 当前节点的值
- 左子树和右子树都是二叉搜索树
示例 1:
输入:root = [1,null,2,2] 输出:[2]
示例 2:
输入:root = [0] 输出:[0]
提示:
- 树中节点的数目在范围
[1, 104]
内 -105 <= Node.val <= 105
进阶:你可以不使用额外的空间吗?(假设由递归产生的隐式调用栈的开销不被计算在内)
思路
- 使用maxCount变量记录二叉搜索树的最大众数个数,使用count记录二叉搜索树的数字个数
- 使用一个前驱节点prev,记得一般利用二叉搜索树的中序遍历有序性一般都要有prev,因为要让当前节点与前驱节点值比较
- 当 前驱结点值与当前节点的值相同时候,该数字个数++,否则为该数字个数1
- 当数字个数=最大众数个数,就将其节点值加进list中
- 因为有可能遍历其他节点值的时候,个数超过原先众数最大值,所以这时要将list清空,重新把当前节点加入list,然后重新更新maxCount
本题依然利用二叉搜索树的中序遍历的有序性(为递增的).记得要用前驱指针奥.
迭代
class Solution {
private List<Integer> res = new ArrayList<>();
private int maxCount = 0;//记录二叉搜索树中的最大众数个数
private int count = 0;//记录二叉搜索树中每一个数字的个数
private TreeNode prev = null;//前驱节点,用于与当前节点比较,如果相等,count++;该数字个数+1
private void dfs(TreeNode root) {
if(root==null) return;
//进行中序遍历,还是利用二叉搜索树的特性,中序遍历 的序列是递增的
dfs(root.left);
if(prev==null){//如果前驱节点为null,该数字个数为1
count = 1;
}else {
if(prev.val==root.val){//如果当前节点与前驱节点的值相等,该数字个数+1
count++;
}else {//如果当前节点与前驱节点的值不相等,该数字个数为1
count = 1;
}
}
prev = root;//遍历到下一个节点的时候,更新前驱节点
if(count==maxCount){//如果当前数字个数=最大众数个数,把它加到list中
res.add(root.val);
}
if(count>maxCount) {
//如果当前数字个数>最大众数个数,清空list,把当前节点加入list,同时更新maxCount
res.clear();
res.add(root.val);
maxCount = count;
}
dfs(root.right);
}
public int[] findMode(TreeNode root) {
dfs(root);
int[] array = new int[res.size()];
for(int i =0;i<res.size();++i){
array[i] = res.get(i);
}
return array;
}
}