LeetCode 501. Find Mode in Binary Search Tree
LeetCode 501. Find Mode in Binary Search Tree (二叉搜索树中的众数)
题目
链接
https://leetcode.cn/problems/find-mode-in-binary-search-tree/
问题描述
给你一个含重复值的二叉搜索树(BST)的根节点 root ,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。
如果树中有不止一个众数,可以按 任意顺序 返回。
假定 BST 满足如下定义:
结点左子树中所含节点的值 小于等于 当前节点的值
结点右子树中所含节点的值 大于等于 当前节点的值
左子树和右子树都是二叉搜索树
示例
输入:root = [1,null,2,2]
输出:[2]
提示
树中节点的数目在范围 [1, 104] 内
-105 <= Node.val <= 105
思路
采用暴力法,直接遍历,之后根据出现次数找到众数。
复杂度分析
时间复杂度 O(n)
空间复杂度 O(n)
代码
Java
public int[] findMode(TreeNode root) {
Map<Integer, Integer> map = new HashMap<>();
List<Integer> list = new ArrayList<>();
if (root == null) {
return list.stream().mapToInt(Integer::intValue).toArray();
}
searchBST(root, map);
List<Map.Entry<Integer, Integer>> mapList = map.entrySet().stream()
.sorted((c1, c2) -> c2.getValue().compareTo(c1.getValue()))
.collect(Collectors.toList());
list.add(mapList.get(0).getKey());
for (int i = 1; i < mapList.size(); i++) {
if (mapList.get(i).getValue().equals(mapList.get(i - 1).getValue())) {
list.add(mapList.get(i).getKey());
} else {
break;
}
}
return list.stream().mapToInt(Integer::intValue).toArray();
}
public void searchBST(TreeNode root, Map<Integer, Integer> map) {
if (root == null) {
return;
}
map.put(root.val, map.getOrDefault(root.val, 0) + 1);
searchBST(root.left, map);
searchBST(root.right, map);
}