501. 二叉搜索树中的众数

给你一个含重复值的二叉搜索树(BST)的根节点 root ,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。

如果树中有不止一个众数,可以按 任意顺序 返回。

假定 BST 满足如下定义:

结点左子树中所含节点的值 小于等于 当前节点的值
结点右子树中所含节点的值 大于等于 当前节点的值
左子树和右子树都是二叉搜索树
 

示例 1:


输入:root = [1,null,2,2]
输出:[2]
示例 2:

输入:root = [0]
输出:[0]
 

提示:

树中节点的数目在范围 [1, 104] 内
-105 <= Node.val <= 105
 

进阶:你可以不使用额外的空间吗?(假设由递归产生的隐式调用栈的开销不被计算在内)

 public int[] findMode(TreeNode root) {
        Map map = new HashMap();
        Queue queue = new LinkedList<>();
        queue.add(root);
        while (!queue.isEmpty()) {
            int size = queue.size();
            for (int i = 0; i < size; i++) {
                TreeNode cur = queue.poll();
                map.put(cur.val, map.getOrDefault(cur.val, 0) + 1);
                if (cur.left != null) {
                    queue.add(cur.left);
                }
                if (cur.right != null) {
                    queue.add(cur.right);
                }
            }
        }
        LinkedHashMap map1 = sortMap(map);
        int max = 0;
        for (Map.Entry e : map1.entrySet()
        ) {
            max = Math.max(max, e.getValue());
        }
        List list = new ArrayList();
        for (Map.Entry e : map1.entrySet()
        ) {
            if (e.getValue() == max) {
                list.add(e.getKey());
            }
        }
        int[] res = new int[list.size()];
        for (int i = 0; i < list.size(); i++) {
            res[i] = list.get(i);
        }
        return res;
    }

    public LinkedHashMap sortMap(Map map) {
        //利用Map的entrySet方法,转化为list进行排序
        List> entryList = new ArrayList<>(map.entrySet());
        //利用Collections的sort方法对list排序
        Collections.sort(entryList, new Comparator>() {
            @Override
            public int compare(Map.Entry o1, Map.Entry o2) {
                //正序排列,倒序反过来
                return o1.getValue() - o2.getValue();
            }
        });
        //遍历排序好的list,一定要放进LinkedHashMap,因为只有LinkedHashMap是根据插入顺序进行存储
        LinkedHashMap linkedHashMap = new LinkedHashMap();
        for (Map.Entry e : entryList
        ) {
            linkedHashMap.put(e.getKey(), e.getValue());
        }
        return linkedHashMap;
    }

你可能感兴趣的:(Leetcode,java,算法,leetcode)