Given a binary search tree (BST) with duplicates, find all themode(s)(the most frequently occurred element) in the given BST.
Assume a BST is defined as follows:
The left subtree of a node contains only nodes with keys less than or equal to the node's key.
The right subtree of a node contains only nodes with keys greater than or equal to the node's key.
Both the left and right subtrees must also be binary search trees.
For example:
Given BST[1,null,2,2],
1
\
2
/
2
return[2].
Note:If a tree has more than one mode, you can return them in any order.
Follow up:Could you do that without using any extra space? (Assume that the implicit stack space incurred due to recursion does not count).
2. Implementation
(1) BFS + HashMap
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;
}
}