501. 二叉搜索树中的众数
给你一个含重复值的二叉搜索树(BST)的根节点 root ,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。
如果树中有不止一个众数,可以按 任意顺序 返回。
假定 BST 满足如下定义:
结点左子树中所含节点的值 小于等于 当前节点的值
结点右子树中所含节点的值 大于等于 当前节点的值
左子树和右子树都是二叉搜索树
示例 1:
**输入:**root = [1,null,2,2]
输出:[2]
示例 2:
**输入:**root = [0]
输出:[0]
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public static int[] findMode(TreeNode root) {
int[] count = new int[1];
int[] maxCount = new int[1];
maxCount[0] = 1;
int[] temp = new int[1];
ArrayList<Integer> list=new ArrayList<>();
int[] start = new int[1];
start[0] = -1;
inOrder(root,count,maxCount,temp,start,list);
int[] ints=new int[list.size()];
for (int i = 0; i < list.size(); i++) {
ints[i] = list.get(i);
}
return ints;
}
private static void inOrder(TreeNode root, int[] count, int[] maxCount, int[] temp, int[] start, ArrayList<Integer> list) {
if(root.left!=null){
inOrder(root.left,count,maxCount,temp,start,list);
}
if(start[0]==-1){
start[0] = 1;
temp[0] =root.val;
count[0] = 1;
list.add(temp[0]);
}
else {
if(temp[0]==root.val) {
count[0]++;
if(count[0]==maxCount[0]){
list.add(temp[0]);
}
if(count[0]>maxCount[0]) {
maxCount[0] = count[0];
while (!list.isEmpty()){
list.remove(0);
}
list.add(temp[0]);
}
}
else {
temp[0] = root.val;
count[0] = 1;
if(count[0]==maxCount[0]) list.add(temp[0]);
}
}
if(root.right!=null){
inOrder(root.right,count,maxCount,temp,start,list);
}
}
}