二叉树算法题(18)二叉搜索树中的众数

目录

二叉搜索树中的众数

描述

示例

方法:中序遍历+递归


二叉搜索树中的众数

描述

给定一个有相同值的二叉搜索树(BST),找出 BST 中的所有众数(出现频率最高的元素)。

假定 BST 有如下定义:

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

示例

给定 BST [1,null,2,2],

   1
    \
     2
    /
   2

返回[2]

提示:如果众数超过1个,不需考虑输出顺序

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

方法:中序遍历+递归

我们可以中序遍历得到一个升序的数组,然后遍历这个数组查找相邻位置的数是否相同,即可完成查找众数的操作。

class Solution {
    public List<Integer> res=new ArrayList<>();
    public int len,pre,maxlen;

    public int[] findMode(TreeNode root) {
        dfs(root);//中序遍历二叉树
        return res.stream().mapToInt(Integer::valueOf).toArray();
    }

    public void dfs(TreeNode root){//中序遍历得到升序数组
        if(root==null) return;
        dfs(root.left);//递归遍历左子树
        update(root.val);//更新当前的众数
        dfs(root.right);//递归遍历右子树
    }

    public void update(int cur){
        if (cur==pre){//如果当前元素和上一个元素相同
            len++;//长度自增
        }else{
            len=1;//重置长度
            pre=cur;//更新pre
        }
        if (len==maxlen) res.add(pre);//如果长度与最大值相等,则将当前元素加入res
        if (len>maxlen){
            maxlen=len;//更新最大长度
            res.clear();//清空之前的结果
            res.add(pre);//将当前元素加入res结果列表
        }
    }
}

Guess you like

Origin blog.csdn.net/weixin_39478524/article/details/121050832