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

  • 相关阅读:
    js 判断多个一样的name
    VisualSVN Server的配置和使用方法 图文
    file get contents 访问不了域名原因
    js confirm函数 删除提示
    关于PHP的curl开启问题
    重置svn地址
    google 火狐 模拟显示手机页面插件
    开启Apache mod_rewrite模块完全解答
    zend studio 9.0.4 破解、汉化和字体颜色及快捷键相关设置
    zend studio 8 修字体和大小
  • 原文地址:https://www.cnblogs.com/fatttcat/p/10200168.html
Copyright © 2011-2022 走看看