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);
    }
posted @ 2022-06-09 17:05  cheng102e  阅读(25)  评论(0编辑  收藏  举报