刷题小记 (19) LeetCode 501 二叉搜索树中的众数

LeetCode 501

2020.8.16

我的通过代码

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    int current = 0; //当前遍历到的这个数字出现的次数
    int ret = 0; //众数的个数
    int max = 0; //众数出现的次数
    int[] retArray; //返回用的数组
    TreeNode node = null; //指向上一个节点,这样可以得知从一个数变为下一个数的过程
    public int[] findMode(TreeNode root) {
        traverse(root);
        retArray = new int[ret];
        current = 0;
        ret = 0;
        node = null;
        traverse(root);
        return retArray;
    }

    //中序遍历
    void traverse(TreeNode root) {
        if(root==null) return;
        traverse(root.left);

        if(node!=null&&node.val==root.val) {
            current++;
        } else current = 0;

        if(current>max) {
            max = current;
            ret = 1;  //新王登基!
        } else if(current==max) {
            //一山容二虎了
            if(retArray!=null) {
                retArray[ret] = root.val;
            }
            ret++;
        }
        node = root;




        traverse(root.right);
    }

}

这道题题目给了个小要求,除了最后return用的那个数组,不要开辟别的空间。

这就稍微有点麻烦了,因为我们既要知道众数有几个,还要知道它们是谁,这的确很难在一次遍历中全部得到。

一次不行,咱们就来两次。

第一次中序遍历计算众数的个数,有了这个个数我们才能初始化记录众数元素的数组,这样再做一次中序遍历就可以记录下来它们是谁了。

要点

循环中,current表示node指向的这个节点的数字出现的次数,那么在数字切换的时候,一定要把current还原为0.

第二次遍历主要是为了将众数记录进retArray数组,那么max是不需要重新归零的,如果归零了就无法第一时间将众数记录进数组了,因为当发现那个数是众数的时候,循环已经结束了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值