zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    centos7.6 安装与配置 MongoDB yum方式
    MongoDB 介绍
    centos 关闭selinux
    前端 HTML标签属性
    前端 HTML 标签嵌套规则
    前端 HTML 标签分类
    前端 HTML body标签相关内容 常用标签 表单标签 form里面的 input标签介绍
    前端 HTML body标签相关内容 常用标签 表单标签 form 表单控件分类
    前端 HTML form表单标签 select标签 option 下拉框
    POJ 1426
  • 原文地址:https://www.cnblogs.com/jimmycheng/p/7135597.html
Copyright © 2011-2022 走看看