给定一个有相同值的二叉搜索树(BST),找出 BST 中的所有众数(出现频率最高的元素)。
假定 BST 有如下定义:
结点左子树中所含结点的值小于等于当前结点的值
结点右子树中所含结点的值大于等于当前结点的值
左子树和右子树都是二叉搜索树
例如:
给定 BST [1,null,2,2],
1
\
2
/
2
返回[2].
================================================================================================
思路:对二叉树进行遍历,然后求出最大值,最后输出个数与最大值相同的字母。
代码:
定义二叉树的类:
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
题解:
public static void main(String[] args) {
TreeNode root = new TreeNode(2147483647);
root.left = new TreeNode(6);
root.right = new TreeNode(8);
root.left.left = new TreeNode(5);
root.left.right = new TreeNode(7);
root.right.left = new TreeNode(9);
root.right.right = new TreeNode(1);
System.out.println(Arrays.toString(findMode(root)));
}
//将map与最大值的信号量定义成静态,因为在两个方法中都要访问到
static Map<Integer, Integer> map = new HashMap<>();
static int max = 0;
public static int[] findMode(TreeNode root) {
Search(root);
/*
* 定义list与set,对map进行处理,将个数与最大值相等的字符存到list中
*/
ArrayList<Integer> list = new ArrayList<>();
Set<Map.Entry<Integer,Integer>> set = map.entrySet();
for(Map.Entry<Integer, Integer> s : set){
if(s.getValue() == max){
list.add(s.getKey());
}
}
//将list转到int数组中
int[] n = new int[list.size()];
int i = 0;
for(Integer s : list)
n[i++] = s;
return n;
}
public static void Search(TreeNode root){
if(root == null)
return;
//递归左子树
Search(root.left);
//如果存在val值就加1存储,不存在就存0
map.put(root.val,map.getOrDefault(root.val,0) + 1);
//判断最大值
if(map.get(root.val) > max){
max = map.get(root.val);
}
//递归右子树
Search(root.right);
}