【刷题打卡】501. 二叉搜索树中的众数

85 阅读1分钟

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

一、题目描述:

501. 二叉搜索树中的众数

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

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

假定 BST 满足如下定义:

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

示例 1:

image.png

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

示例 2:

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

提示:

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

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

二、思路分析:

还是利用了二叉搜索树的本质,形成了一个有序数组,通过maxcount来记录最大的出现次数,通过单独的count来记录一个元素的出现次数 如果count>maxcount 新王以立!杀杀杀杀杀杀!以前的所有元素都不够格了,我们全部删除,如果count == maxcount,那么我们就把这个元素加进来

三、AC 代码:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
        TreeNode pre ;
        ArrayList<Integer> mylist = new ArrayList();
        int count = 0;
        int maxcount = 0;
    public int[] findMode(TreeNode root) {
        happy(root);
        //现在构造数组
        int[] res = new int[mylist.size()];
        for(int i = 0;i<res.length;i++)
        {
            res[i] = mylist.get(i);
        }
        return res;
    }
    void happy(TreeNode root)
    {
        if(root==null)
        {
            return ;
        }
        happy(root.left);
        if(pre==null||pre.val!=root.val)
        {
            count = 1;
        }else
        {
            count++;
        }
        pre = root;
        if(count>maxcount)
        {
            mylist.clear();
            mylist.add(root.val);
            maxcount = count;
        }
        else if(count==maxcount)
        {
            mylist.add(root.val);
        }



        happy(root.right);
    }
}

范文参考

ACM 选手图解 LeetCode 二叉搜索树中的众数(递归 + 非递归)| 编程文青李狗蛋 - 二叉搜索树中的众数 - 力扣(LeetCode)