class Solution {
public int[] findMode(TreeNode root) {
if (root == null) {
return new int[0];
}
Map<Integer, Integer> map = new HashMap<>();
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);
int max = 0;
while (!queue.isEmpty()) {
int size = queue.size();
for (int i = 0; i < size; i++) {
TreeNode curNode = queue.remove();
map.put(curNode.val, map.getOrDefault(curNode.val, 0) + 1);
max = Math.max(max, map.get(curNode.val));
if (curNode.left != null) {
queue.add(curNode.left);
}
if (curNode.right != null) {
queue.add(curNode.right);
}
}
}
List<Integer> list = new ArrayList<>();
for (int key : map.keySet()) {
if (max == map.get(key)) {
list.add(key);
}
}
int index = 0;
int[] res = new int[list.size()];
for (int e : list) {
res[index++] = e;
}
return res;
}
}
class Solution {
public int[] findMode(TreeNode root) {
int[] pre = new int[1];
int[] curMax = new int[1];
int[] max = new int[1];
List<Integer> modes = new ArrayList<>();
inorderTraverse(root, pre, curMax, max, modes);
int[] res = new int[modes.size()];
for (int i = 0; i < modes.size(); i++) {
res[i] = modes.get(i);
}
return res;
}
public void inorderTraverse(TreeNode node, int[] pre, int[] curMax, int[] max, List<Integer> modes) {
if (node == null) {
return;
}
inorderTraverse(node.left, pre, curMax, max, modes);
if (node.val == pre[0]) {
curMax[0] += 1;
}
else {
curMax[0] = 1;
}
if (curMax[0] == max[0]) {
modes.add(node.val);
}
else if (curMax[0] > max[0]) {
max[0] = curMax[0];
modes.clear();
modes.add(node.val);
}
pre[0] = node.val;
inorderTraverse(node.right, pre, curMax, max, modes);
}
}