携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第17天,点击查看活动详情
一、题目描述:
501. 二叉搜索树中的众数 - 力扣(LeetCode) (leetcode-cn.com)
给你一个含重复值的二叉搜索树(BST)的根节点 root ,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。
如果树中有不止一个众数,可以按 任意顺序 返回。
假定 BST 满足如下定义:
- 结点左子树中所含节点的值 小于等于 当前节点的值
- 结点右子树中所含节点的值 大于等于 当前节点的值
- 左子树和右子树都是二叉搜索树
示例 1:
输入:root = [1,null,2,2]
输出:[2]
示例 2:
输入:root = [0]
输出:[0]
提示:
- 树中节点的数目在范围 [1, 10^4] 内
- -10^5 <= Node.val <= 10^5
进阶:你可以不使用额外的空间吗?(假设由递归产生的隐式调用栈的开销不被计算在内)
二、思路分析:
- 众数即为出现次数最多的元素,首先先设maxCount=1,依次得出当前出现最多的次数,如果大于maxCount, 则更新最大次数,并清空集合,从新放入数据。如果小于maxCount,则进行下一个比较,如果等于,直接放入集合数据。
- 利用中序遍历,即可得到一个升序排列的数据,便于比较。
三、AC 代码:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
TreeNode preNode=null;
int curCount=1,maxCount=1;
public int[] findMode(TreeNode root) {
List<Integer> list=new LinkedList<>();
inOrder(root,list);
int[] times=new int[list.size()];
int i=0;
for(int num:list)
times[i++]=num;
return times;
}
public void inOrder(TreeNode root,List<Integer> nums){
if(root==null) return;
inOrder(root.left,nums);
if(preNode!=null){
if(root.val==preNode.val) curCount++;
else curCount=1;
}
if(curCount>maxCount){
maxCount=curCount;
nums.clear();
nums.add(root.val);
}
else if(curCount==maxCount){
nums.add(root.val);
}
preNode=root;
inOrder(root.right,nums);
}
}
四、参考:
C# 不使用额外空间的办法,就是维护全局变量,递归的过程中维护此全局变量,像是在一个非地方方法中维护非全局变量一样 - 二叉搜索树中的众数 - 力扣(LeetCode)