LeetCode每日1题--二叉搜索树中的众数

44 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第11天,点击查看活动详情

前言

算法的重要性不言而喻!区分度高!

现在学习的门槛低了,只有能上网每个人都可以学编程!培训班6个月就可以培养出来能干活的人,你怎么从这些人中脱颖而出?没错!就是学算法,学一些底层和基础的东西。

说的功利点是为了竞争,卷死对手。真心话说就是能提高自己的基础能力,为技术可持续发展做好充分的准备!!!

提前入门学习书籍:CPrimerPlus、大话数据结构

image-20220705103735001

刷题网站

代码随想录 (programmercarl.com)

leetcode

我是按照代码随想录提供的刷题顺序进行刷题的,大家也可以去刷leetcode最热200道,都可以

刷题嘛,最重要的就是坚持了!!!

画图软件

OneNote

这个要经常用,遇见不懂的流程的话就拿它画一画!

笔记软件

Typoral

题目

image.png

解析

这里依旧是利用二叉搜索树的特性去找到众数

递归三部曲

  1. 确定递归的参数和返回值

找打众数,那就是返回int型。参数就是搜索树的根节点


public void findMode1(TreeNode root) {}

  1. 确定递归终止的条件

如果节点为空就终止

if (root == null) {
    return;
}
  1. 确定单层递归的逻辑

就是走中序遍历呗,这里是怎么获得众数的呢?

变量的作用:

  1. 首先定义变量count,它是负责对每个元素的值出现的次数计数
  2. 然后是maxCount,它是树中元素出现次数最多的个数
  3. 变量resList,它是存放众数的结果集合
  4. TreeNode pre,它是存放遍历过程中的上一个节点

如何求得众数

  1. 首先获得节点的值,如果该节点的值不等于上一个节点的值那么就让count+1,并把该count赋值给maxCount
  2. 拿count的值和maxCount比较
  3. 如果小于maxCount那就不做操作,只把该节点的值赋值给pre
  4. 如果大于maxCount的值那就清空resList集合将该节点的值放到resList里面
  5. 如果等于那把该节点的值也加到resList里面

这样的出现次数最多的数就在resList里面了

findMode1(root.left);

int rootValue = root.val;
// 计数
if (pre == null || rootValue != pre.val) {
    count = 1;
} else {
    count++;
}

// 更新结果以及maxCount
if (count > maxCount) {
    resList.clear();
    resList.add(rootValue);
    maxCount = count;
} else if (count == maxCount) {
    resList.add(rootValue);
}

pre = root;

findMode1(root.right);

完整代码

没什么好说的,就是刷就完了。


class Solution {
    ArrayList<Integer> resList;
    int maxCount;
    int count;
    TreeNode pre;

    public int[] findMode(TreeNode root) {
        resList = new ArrayList<>();
        maxCount = 0;
        count = 0;
        pre = null;
        findMode1(root);
        int[] res = new int[resList.size()];
        for (int i = 0; i < resList.size(); i++) {
            res[i] = resList.get(i);
        }
        return res;
    }

    public void findMode1(TreeNode root) {
        if (root == null) {
            return;
        }
        findMode1(root.left);

        int rootValue = root.val;
        // 计数
        if (pre == null || rootValue != pre.val) {
            count = 1;
        } else {
            count++;
        }
        // 更新结果以及maxCount
        if (count > maxCount) {
            resList.clear();
            resList.add(rootValue);
            maxCount = count;
        } else if (count == maxCount) {
            resList.add(rootValue);
        }
        pre = root;

        findMode1(root.right);
    }
}