给定一个有相同值的二叉搜索树(BST),找出 BST 中的所有众数(出现频率最高的元素)。
假定 BST 有如下定义:
结点左子树中所含结点的值小于等于当前结点的值
结点右子树中所含结点的值大于等于当前结点的值
左子树和右子树都是二叉搜索树
例如:
给定 BST [1,null,2,2],
1
\
2
/
2
返回[2].
提示:如果众数超过1个,不需考虑输出顺序
进阶:你可以不使用额外的空间吗?(假设由递归产生的隐式调用栈的开销不被计算在内)
class Elem {
int value;
int count;
Elem(int value) {
this.value = value;
this.count = 1;
}
}
class Solution {
TreeNode pre = null;
int max = 1;
ArrayList<Elem> list = new ArrayList<>();
public int[] findMode(TreeNode root) {
inOrder(root);
ArrayList<Integer> retList = new ArrayList();
for (Elem elem : list) {
if (elem.count == max) {
retList.add(elem.value);
}
}
return retList.stream().mapToInt(Integer::valueOf).toArray();
}
private void inOrder(TreeNode root) {
if (root != null) {
inOrder(root.left);
if (pre == null || root.val != pre.val) {
Elem elem = new Elem(root.val);
list.add(elem);
pre = root;
} else {
Elem elem = list.get(list.size() - 1);
elem.count++;
list.set(list.size() - 1, elem);
if (elem.count > max) max = elem.count;
}
inOrder(root.right);
}
}
}