/**
* 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 {
List<Integer> ans = new ArrayList<Integer>();
int base, cnt, maxCnt;
//找到众数
public int[] findMode(TreeNode root) {
dfs(root);
//结果,可能有多个,所以用数组存储
int[] mode = new int[ans.size()];
//从ans中提取结果
for (int i = 0; i < ans.size(); i ++) {
mode[i] = ans.get(i);
}
return mode;
}
public void dfs(TreeNode node) {
if (node == null)
return;
//中序遍历,因为这样可以从小到大遍历二叉搜索树
dfs(node.left);
update(node.val);
dfs(node.right);
}
//对各个数字进行计数,并利用二叉搜索树的性质,设计算法
public void update(int num) {
//之前出现过
if (num == base)
cnt ++;
//没出现过,从头开始计数
else {
cnt = 1;
base = num;
}
//可能是众数
if (cnt == maxCnt)
ans.add(base);
//用cnt更新maxCnt,需要对之前存储过的base进行清理,因为maxCnt更新了,说明之前的不是众数
if (cnt > maxCnt) {
maxCnt = cnt;
ans.clear();
ans.add(base);
}
}
}
二叉搜索树中的众数
最新推荐文章于 2022-01-30 09:24:43 发布