leetcode算法501. 二叉搜索树中的众数

90 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第16天,点击查看活动详情

一、题目描述:

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

给你一个含重复值的二叉搜索树(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  

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

二、思路分析:

一次遍历,按照中序遍历,就是相当于遍历不减数组,记录下前驱,如果本值与前驱的值相同,那么current++;表示包括自己已经有了这么多为值为root.val的结点;不然current变为1,表示自己这个值第一次出现。

在遍历到一个节点后,不断的更新当前出现过的mostCount(众数出现的次数),因为众数不止一个,所以在current==mostCount时候,加入到列表中,然后要是current大于了mostCount证明新的众数出现了,然后就将之前的全部清空,将自己加入

三、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 = null;
    int mostCount = 0;
    int current = 0;
    LinkedList<Integer> ll = new LinkedList<Integer>();
    public int[] findMode(TreeNode root) {
        inOrder(root);
        int[] res = new int[ll.size()];
        for(int i = 0;i < ll.size();i++){
            res[i] = ll.get(i);
        }
        return res;
    }
    void inOrder(TreeNode root){
        //统计出出现了多少次才算众数
        if(root == null)return ;
        inOrder(root.left);

        if(pre == null){
            pre = root;
            mostCount = 1;
            current = 1;
            ll.add(root.val);
        }else{
            if(pre.val == root.val){
                current++;
                if(current == mostCount){
                    ll.add(root.val);
                }else if(current > mostCount){
                    ll.clear();
                    ll.add(root.val);
                    mostCount = current;
                }  
            }else{
                current = 1;
                if(current == mostCount){
                    ll.add(root.val);
                }
            }
            pre = root;
        }
        inOrder(root.right);

    }
}