Bootstrap

LeetCode:501.二叉搜索树中的众数

跟着carl学算法,本系列博客仅做个人记录,建议大家都去看carl本人的博客,写的真的很好的!
代码随想录

LeetCode:501.二叉搜索树中的众数
给你一个含重复值的二叉搜索树(BST)的根节点 root ,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。
如果树中有不止一个众数,可以按 任意顺序 返回。
假定 BST 满足如下定义:
结点左子树中所含节点的值 小于等于 当前节点的值
结点右子树中所含节点的值 大于等于 当前节点的值
左子树和右子树都是二叉搜索树
示例 1:
在这里插入图片描述
输入:root = [1,null,2,2]
输出:[2]
示例 2:
输入:root = [0]
输出:[0]

记录countmaxCount ,如果count > maxCount则更新maxCountres,这样的话可以一次遍历就得出结果

	TreeNode pre;
    int count = 0;
    int maxCount = 0;
    List<Integer> res = new ArrayList<>();

    public int[] findMode(TreeNode root) {
        traversal(root);
        
        // return res.stream().mapToInt(Integer::intValue).toArray();
        // 下面这种方式返回在leetcode上感觉更快
        int[] arr = new int[res.size()];
        int index = 0;
        for (int i : res) {
            arr[index] = i;
            index++;
        }
        return arr;
    }

    private void traversal(TreeNode cur) {
        if (cur == null)
            return;

        // 左
        traversal(cur.left);

        // 中
        if (pre == null || cur.val != pre.val) {
            count = 1;
        } else if (cur.val == pre.val) {
            count++;
        }

        if (maxCount == count) {
            res.add(cur.val);
        } else if (count > maxCount) {
            maxCount = count;
            res.clear();
            res.add(cur.val);
        }
        pre = cur;

        // 右
        traversal(cur.right);
    }
;