zoukankan      html  css  js  c++  java
  • 501. Find Mode in Binary Search Tree

    Given a binary search tree (BST) with duplicates, find all the mode(s) (the most frequently occurred element) in the given BST.

    Assume a BST is defined as follows:

    • The left subtree of a node contains only nodes with keys less than or equal to the node's key.
    • The right subtree of a node contains only nodes with keys greater than or equal to the node's key.
    • Both the left and right subtrees must also be binary search trees.

    For example:
    Given BST [1,null,2,2],

       1
        
         2
        /
       2
    

    return [2].

    Note: If a tree has more than one mode, you can return them in any order.

    Follow up: Could you do that without using any extra space? (Assume that the implicit stack space incurred due to recursion does not count).

    M1: using extra space

    traverse的时候,用hashmap存每个节点出现的次数

    time: O(n), space: O(n)

    /**
     * Definition for a binary tree node.
     * public class TreeNode {
     *     int val;
     *     TreeNode left;
     *     TreeNode right;
     *     TreeNode(int x) { val = x; }
     * }
     */
    class Solution {
        int max = 0;
        
        public int[] findMode(TreeNode root) {
            if(root == null) {
                return new int[] {};
            }
            Map<Integer, Integer> map = new HashMap<>();
            traverse(root, map);
            
            List<Integer> tmp = new ArrayList<>();
            for(Map.Entry<Integer, Integer> entry : map.entrySet()) {
                if(entry.getValue() == max) {
                    tmp.add(entry.getKey());
                }
            }
            
            int[] res = new int[tmp.size()];
            for(int i = 0; i < tmp.size(); i++) {
                res[i] = tmp.get(i);
            }
            return res;
        }
        
        public void traverse(TreeNode root, Map<Integer, Integer> map) {
            if(root == null) {
                return;
            }
            map.put(root.val, map.getOrDefault(root.val, 0) + 1);
            max = Math.max(max, map.get(root.val));
            traverse(root.left, map);
            traverse(root.right, map);
        }
    }

    M2: optimized, not using extra space

  • 相关阅读:
    (算法)最长重叠线段或区间
    (算法)判断两个区间是否重叠
    (笔试题)洗牌算法
    (笔试题)和一半的组合数
    (笔试题)删除K位数字
    (C语言)memcpy函数原型的实现
    每天坚持10分钟,改变你的人生
    你是哪种层次的程序员?程序员的四种类型
    2012年,软件开发者薪资大调查
    上班族:不要让自己成为老板的“日用品”!
  • 原文地址:https://www.cnblogs.com/fatttcat/p/10200168.html
Copyright © 2011-2022 走看看