Leetcode No.501 二叉搜索树中的众数

题目大意

给定一个有相同值的二叉搜索树(BST),找出 BST 中的所有众数(出现频率最高的元素)。
假定 BST 有如下定义:

  1. 结点左子树中所含结点的值小于等于当前结点的值
  2. 结点右子树中所含结点的值大于等于当前结点的值
  3. 左子树和右子树都是二叉搜索树
    例如:
    image.png

    提示:如果众数超过1个,不需考虑输出顺序。
    进阶:你可以不使用额外的空间吗?(假设由递归产生的隐式调用栈的开销不被计算在内)。

方法一

利用递归遍历的方式遍历树的每个结点,统计每个结点的值出现的次数,并得出最多的次数maxCnt。最后对Map进行一次遍历,找出出现次数等于maxCnt的所有val。

public int[] findMode(TreeNode root) {
        HashMap<Integer,Integer> map = new HashMap<>();
        PreOrder(root,map);

        int maxCnt = -1;
        for(Map.Entry<Integer,Integer> entry:map.entrySet()) 
            maxCnt = Math.max(maxCnt,entry.getValue());
        
        ArrayList<Integer> ans = new ArrayList<>();
        for(Map.Entry<Integer,Integer> entry:map.entrySet()) {
            if(entry.getValue() == maxCnt) ans.add(entry.getKey());
        }

        return ans.stream().mapToInt(Integer::valueOf).toArray();
    }

    private void PreOrder(TreeNode root,HashMap<Integer,Integer>map) {
        if(root == null) return;
        map.put(root.val,map.getOrDefault(root.val,1)+1);
        PreOrder(root.left,map);
        PreOrder(root.right,map);
    }

运行时间16ms,击败9.54%。

方法二

用curTimes和maxTimes动态维护众数的次数。遍历为中序遍历,因为二叉搜素树有大小的顺序关系。

List<Integer> res = new LinkedList<>();
    int curTimes = 0;
    int maxTimes = 0;
    TreeNode pre = null;

    public int[] findMode(TreeNode root) {
         if(root == null) return new int[]{};
         InOrder(root);
         return res.stream().mapToInt(Integer::valueOf).toArray();
     }

     private void InOrder(TreeNode root) {
        if(root == null) return;
        InOrder(root.left);
        if(pre!=null && pre.val == root.val)
            curTimes += 1;
        else curTimes = 1;

        if(curTimes == maxTimes)  res.add(root.val);
        else if(curTimes>maxTimes) {
            res.clear();
            res.add(root.val);
            maxTimes = curTimes;
        }
        pre = root;
        InOrder(root.right);
     }    

运行时间6ms,击败34.58%。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,295评论 6 512
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,928评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,682评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,209评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,237评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,965评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,586评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,487评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,016评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,136评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,271评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,948评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,619评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,139评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,252评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,598评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,267评论 2 358

推荐阅读更多精彩内容

  • 1. 前段时间看《演员请就位》,被明道圈粉了。 想当年,在他男主光圈附体、演艺事业如日中天时没有被圈粉,现在确认他...
    莫定格阅读 441评论 0 0
  • 最近有时候坐车和打车的过程中经常会遇到路怒症的司机,前天有位司机跟迎面而来的一辆电动车差点相撞引发事故了,那位司机...
    灵泉知音阅读 198评论 0 0
  • 人送你什么礼物,多反映他的价值观。 物质是很重要的。 在物质上慷慨的人,在情感上未必大方,但在物质上吝啬的人,在情...
    小雪_8571阅读 659评论 2 3
  • 超级佩服博主佳音呀,她把生活过成了艺术。然后我就心血来潮,也想胡乱留下点东西。过成艺术到不必,本身是个糙人,坚持到...
    Nimvf阅读 218评论 0 0
  • 2018年6月6日星期三晴424 刚刚洗漱完躺下,儿子还没入睡呢。今天儿子写完作业早,我出去有点事回来儿子已...
    A倚窗听雨阅读 200评论 0 1