Java/501. Find Mode in Binary Search Tree 二叉搜索树中的众数

60 篇文章 0 订阅
45 篇文章 0 订阅

题目


 

 

 

代码部分一(11ms)

class Solution {
    Map<Integer, Integer> map = new HashMap();
    int counter = 0;                                //计数器,记录众数出现的次数
    public int[] findMode(TreeNode root) {
        if(root == null)
            return new int[]{};
        
        dfs(root);                                  // 中序遍历树
        
        List<Integer> list = new ArrayList();
        for(int key : map.keySet()){
            if(map.get(key) == counter)
                list.add(key);
        }
        int[] res = new int[list.size()];
        for(int i = 0; i < res.length; i++)
            res[i] = list.get(i);
       
        return res;

    }
    public void dfs(TreeNode root){
        if(root.left != null)
            dfs(root.left);
        map.put(root.val, map.getOrDefault(root.val, 0)+1);
        counter = Math.max(counter, map.get(root.val));
        if(root.right != null)
            dfs(root.right);
            
    }
}
  1. 若树为空,返回空数组

  2. 调用 dfs() 中序遍历搜索树,将节点值作为 key,出现次数作为 value,存入 map

  3. 每次记录次数时,判断当前记录的节点出现次数是否大于旧“众数”,是,则更替为新众数

  4. 遍历 map, 将众数取出存入到 list 中(value == counter)

  5. 将 list 转换为 int[] (注意:list.toArray() -> Integer[])

  6. 返回结果

 

代码部分二(进阶,8ms)

class Solution {
    Integer pre = null;                           // 记录当前的“可能的众数”节点值
    int maxTimes = 0;                             // 记录当前“确定的众数”出现的次数
    int count = 1;                                // 记录“可能的众数”出现的次数
    
    public int[] findMode(TreeNode root) {
        if(root == null)
            return new int[]{};
        
        List<Integer> list = new ArrayList();
        dfs(root, list);
        
        int[] res = new int[list.size()];
        for(int i = 0; i < list.size(); i++)
            res[i] = list.get(i);
        return res;
    }
    public void dfs(TreeNode node, List<Integer> list){
        if(node == null)
            return;
        dfs(node.left, list);
        if(pre != null){
            if(node.val == pre)
                count++;
            else
                count = 1;
        }
        if(count > maxTimes){
            list.clear();
            list.add(node.val);
            maxTimes = count;
        }else if(count == maxTimes){
            list.add(node.val);
        }
        
        pre = node.val;
        dfs(node.right, list);
    }
}
  1. 若树为空,返回空数组
  2. 调用dfs(),传入list
  3. 若节点为空,停止向后递归。通过左中右的顺序遍历搜索树
  4. 若节点值 等于 “可能的众数”,count++,否则 count 置1
  5. 若新出现的众数 出现的次数大于 上一个确定的众数,清空 list,添加新众数,更新 “确定的众数出现的次数”
  6. 若新出现的众数 出现的次数等于 上一个确定的众数,添加多一个众数
  7. 5、6都不成立,则寻找下一个“可能的众数”
  8. 将 list 转换为int[] 返回
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值