题目:leetcode501. 二叉搜索树中的众数
描述:
给你一个含重复值的二叉搜索树(BST)的根节点 root ,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。
如果树中有不止一个众数,可以按 任意顺序 返回。
假定 BST 满足如下定义:
结点左子树中所含节点的值 小于等于 当前节点的值
结点右子树中所含节点的值 大于等于 当前节点的值
左子树和右子树都是二叉搜索树
思路:
这道题使用暴力破解就是遍历整棵树,把每个结点都加入map中,最后得到数量最多的节点,就是众数。
我们现在使用另一个解法,使用中序遍历的方法,因为二叉搜索树进行中序遍历的时候,得到的序列是有序的,所以我们就可以使用这个序列实时计数出现最多的结点,最后得到众数。
代码:
import java.util.ArrayList;
import java.util.List;
public class Solution {
List<Integer> result=new ArrayList<>();
int count=0;
int maxCount=0;
TreeNode pre=new TreeNode();
public int[] findMode(TreeNode root) {
mode(root);
int[] res=new int[result.size()];
for (int i = 0; i < result.size(); i++) {
res[i]=result.get(i);
}
return res;
}
private void mode(TreeNode root) {
//处理空值
if(root==null)
return;
//处理左子树
mode(root.left);
//处理当前节点
if(pre!=null && root.val== pre.val) {
count++;
}
//第一次进入,初始化count=1
else
count=1;
//发现另一个众数,加入结果集
if(count==maxCount)
result.add(root.val);
//之前的众数作废,更新新的众数
if(count>maxCount) {
maxCount = count;
result.clear();
result.add(root.val);
}
//移动后继节点
pre=root;
//处理右子树
mode(root.right);
}
}