• LeetCode 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).


    题目标签:Tree
      这道题目给了我们一个二叉搜索树,让我们找到树的众树 (出现最多的那个值),可以是一个众树,也可以有很多个。看完题目第一个想到用HashMap,但是发现题目最后follow up说不能用extra space。所以我们要另外考虑方法。二叉搜索树的特性,左边 <= 根 <= 右边,这道题目包括了等于。举一个例子:
                          10
                           /      
                                                                                5       13
                          /          
                                                                            3     7       13
                                                                           /          
                                                                         2    3     9
     
       看这个例子,我们试着把它上下压缩一下, 就等于, 2 3 3 5 7 9 10 13 13 ,在纸上画的左右分开比较容易看清。发现这是一个有序的排列。如果我们可以遍历这个顺序的话,它是从小到大的,特点就是,一样的数字一定是连在一起的。这样我们就可以设一个count = 1,一个maxCount = 0 和一个pre Node, count是记录每一个数字的连续出现次数,如果大于maxCount 那就说明这个数字是新的mode,比起之前的数字。 maxCount 记录最大出现次数的mode。pre Node是上一个点的数字,当每次current 点和上一个点比较,是否两个数字相同,来判断需要count++,如果不相同,那就更新count = 1。
      如何得到这个有序排列,可以通过inorder traversal 来实现,需要注意的是, Java 是 Pass by Value 的核心,所以pre node , count 什么的,需要放在function 外面。
     
     

    Java Solution:

    Runtime beats 74.31% 

    完成日期:07/07/2017

    关键词:Tree

    关键点:inorder 遍历 (从小到大顺序)

     1 /**
     2  * Definition for a binary tree node.
     3  * public class TreeNode {
     4  *     int val;
     5  *     TreeNode left;
     6  *     TreeNode right;
     7  *     TreeNode(int x) { val = x; }
     8  * }
     9  */
    10 public class Solution 
    11 {
    12     TreeNode pre = null;
    13     int cnt = 1;
    14     int max_cnt = 0;
    15     
    16     public int[] findMode(TreeNode root) 
    17     {
    18         ArrayList<Integer> res = new ArrayList<>();
    19         
    20         inorder(root, res);
    21         
    22         int[] result = new int[res.size()];
    23         
    24         for(int i=0; i<result.length; i++)
    25             result[i] = res.get(i);
    26         
    27         return result;
    28     }
    29     
    30     public void inorder(TreeNode node, ArrayList<Integer> res)
    31     {
    32         if(node == null)
    33             return;
    34         
    35         inorder(node.left, res);
    36         // meaning this node has a previous node, need to compare them to determine cnt
    37         if(pre != null) 
    38         {    
    39             if(node.val == pre.val) // if this node has same value as pre's
    40                 cnt++;
    41             else // if this node has different value as pre's
    42                 cnt = 1;
    43         }
    44         
    45         // once cnt is greater max_cnt, meaning find a new mode, need to clear res;
    46         if(cnt > max_cnt) 
    47         {
    48             max_cnt = cnt; 
    49             res.clear();
    50             res.add(node.val);
    51         }
    52         else if(cnt == max_cnt) // cnt == max_cnt, meaning find a new mode that equal to pre mode.
    53             res.add(node.val);
    54         
    55             
    56         if(pre == null) // for first most left leaf node, its pre is null, set the first pre node 
    57         {    
    58             pre = new TreeNode(node.val);
    59         }
    60         else // if pre is not null, update this node's val each time
    61             pre.val = node.val;
    62         
    63         
    64         inorder(node.right, res);
    65     }
    66 }

    参考资料:

    http://www.cnblogs.com/grandyang/p/6436150.html

    LeetCode 算法题目列表 - LeetCode Algorithms Questions List

  • 相关阅读:
    转载1
    转载
    WampServer的研究日记一
    第一期 花式自适应网页哪家强? 就选你啦
    缓动函数requestAnimationFrame用法
    原生js canvas 碰撞游戏的开发笔记2
    非常便利的前端模板smarty js 的使用
    原生js canvas 碰撞游戏的开发笔记
    Sublime Text 的研究日记
    面向对象设计模式(目录)
  • 原文地址:https://www.cnblogs.com/jimmycheng/p/7135597.html
Copyright © 2020-2023  润新知