刷题日记 501. 二叉搜索树中的众数

62 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第17天,点击查看活动详情

一、题目描述:

501. 二叉搜索树中的众数 - 力扣(LeetCode) (leetcode-cn.com)

给你一个含重复值的二叉搜索树(BST)的根节点 root ,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。

如果树中有不止一个众数,可以按 任意顺序 返回。

假定 BST 满足如下定义:

  • 结点左子树中所含节点的值 小于等于 当前节点的值
  • 结点右子树中所含节点的值 大于等于 当前节点的值
  • 左子树和右子树都是二叉搜索树  

示例 1:

image.png

输入:root = [1,null,2,2]
输出:[2]

示例 2:

输入:root = [0]
输出:[0]

提示:

  • 树中节点的数目在范围 [1, 10^4] 内
  • -10^5 <= Node.val <= 10^5  

进阶:你可以不使用额外的空间吗?(假设由递归产生的隐式调用栈的开销不被计算在内)

二、思路分析:

  1. 众数即为出现次数最多的元素,首先先设maxCount=1,依次得出当前出现最多的次数,如果大于maxCount, 则更新最大次数,并清空集合,从新放入数据。如果小于maxCount,则进行下一个比较,如果等于,直接放入集合数据。
  2. 利用中序遍历,即可得到一个升序排列的数据,便于比较。

三、AC 代码:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    TreeNode preNode=null;
    int curCount=1,maxCount=1;
    public int[] findMode(TreeNode root) {
        List<Integer> list=new LinkedList<>();
        inOrder(root,list);
        int[] times=new int[list.size()];
        int i=0;
        for(int num:list)
            times[i++]=num;
        return times;
    }
    public void inOrder(TreeNode root,List<Integer> nums){
        if(root==null) return;
        inOrder(root.left,nums);
        if(preNode!=null){
            if(root.val==preNode.val) curCount++;
            else curCount=1;
        }
        if(curCount>maxCount){
            maxCount=curCount;
            nums.clear();
            nums.add(root.val);
        }
        else if(curCount==maxCount){
           nums.add(root.val); 
        }
        preNode=root;
        inOrder(root.right,nums);
    }
}

四、参考:

C# 不使用额外空间的办法,就是维护全局变量,递归的过程中维护此全局变量,像是在一个非地方方法中维护非全局变量一样 - 二叉搜索树中的众数 - 力扣(LeetCode)