// Java program to find the mode of a BST
import java.util.*;
// A binary search tree Node has data,
// pointer to left child and a
// pointer to right child
class Node {
int data;
Node left, right;
// Function to create a new BST node
Node(int item)
{
data = item;
left = right = null;
}
}
class Main {
// Function to insert a new node with
// given key in BST
public static Node insert(Node node, int key)
{
// If the tree is empty,
// return a new node
if (node == null) {
return new Node(key);
}
// Otherwise, recur down the tree
if (key < node.data) {
node.left = insert(node.left, key);
}
else if (key >= node.data) {
node.right = insert(node.right, key);
}
// Return the (unchanged)
// node pointer
return node;
}
// Function to find inorder
// traversal of a BST
public static void
inorderTraversal(Node root, ArrayList<Integer> inorder)
{
// If the tree is empty,
// return NULL
if (root == null) {
return;
}
// recur on left child
inorderTraversal(root.left, inorder);
// Push the data of node in inorder list
inorder.add(root.data);
// recur on right child
inorderTraversal(root.right, inorder);
}
// Function to Mode of a BST
public static ArrayList<Integer> findMode(Node root)
{
ArrayList<Integer> inorder
= new ArrayList<Integer>();
// Find inorder traversal of BST
inorderTraversal(root, inorder);
int mx = Integer.MIN_VALUE;
HashMap<Integer, Integer> mp = new HashMap<>();
// Counting occurrences of each
// element and updating
// maximum frequency
for (int i = 0; i < inorder.size(); i++) {
mp.put(inorder.get(i),
mp.getOrDefault(inorder.get(i), 0) + 1);
mx = Math.max(mp.get(inorder.get(i)), mx);
}
ArrayList<Integer> res = new ArrayList<Integer>();
// Pushing the elements into list
// with highest frequency
for (Map.Entry<Integer, Integer> entry :
mp.entrySet()) {
if (entry.getValue() == mx) {
res.add(entry.getKey());
}
}
return res;
}
// Driver's code
public static void main(String[] args)
{
/* Let us create following BST
100
/ \
50 160
/ \ / \
50 60 140 170 */
Node root = null;
root = insert(root, 50);
insert(root, 60);
insert(root, 50);
insert(root, 160);
insert(root, 170);
insert(root, 140);
insert(root, 100);
// Function call
ArrayList<Integer> r = findMode(root);
System.out.print("Mode of BST is ");
for (Integer i : r) {
System.out.print(i + " ");
}
}
}