501二叉搜索树中的众数
程序员文章站
2022-03-03 11:14:47
...
题目描述
给定一个有相同值的二叉搜索树(BST),找出 BST 中的所有众数(出现频率最高的元素)。
假定 BST 有如下定义:
- 结点左子树中所含结点的值小于等于当前结点的值
- 结点右子树中所含结点的值大于等于当前结点的值
- 左子树和右子树都是二叉搜索树
例如:
给定 BST [1,null,2,2],返回[2].提示:如果众数超过1个,不需考虑输出顺序
思路分析
BST中序遍历是升序序列,逐个比对当前结点(root)值与前驱结点(pre)值。更新当前节点值出现次数(curTimes)及最大出现次数(maxTimes)。
若curTimes=maxTimes,将root.val添加到list中;若curTimes>maxTimes,清空list,再添加,并更新maxTimes为curTimes。
代码实现
public int[] findMode(TreeNode root) {
if (root == null) {
return new int[0];
}
List<Integer> arrayList = new ArrayList<>();
process(root, arrayList);
int[] ret = new int[arrayList.size()];
for (int i = 0; i < arrayList.size(); i++) {
ret[i] = arrayList.get(i);
}
return ret;
}
int curTimes=1;
int maxTimes=0;
TreeNode pre=null;
public void process(TreeNode root, List<Integer> ret) {
if (root == null) {
return;
}
process(root.left, ret);
if (pre != null) {
curTimes = root.val == pre.val ? curTimes + 1 : 1;
}
if (maxTimes == curTimes) {
ret.add(root.val);
} else if (curTimes > maxTimes) {
maxTimes = curTimes;
ret.clear();
ret.add(root.val);
}
pre = root;
process(root.right, ret);
}
推荐阅读
-
Java实现的二叉树常用操作【前序建树,前中后递归非递归遍历及层序遍历】
-
Python实现查找二叉搜索树第k大的节点功能示例
-
Java创建二叉搜索树,实现搜索,插入,删除的操作实例
-
Java实现的二叉树常用操作【前序建树,前中后递归非递归遍历及层序遍历】
-
Python中的二叉树查找算法模块使用指南
-
Python利用前序和中序遍历结果重建二叉树的方法
-
Python实现查找二叉搜索树第k大的节点功能示例
-
C语言实现线索二叉树的前中后创建和遍历详解
-
荐 Java刷题笔记15:不同的二叉搜索树( Unique Binary Search Trees)
-
Python实现输入二叉树的先序和中序遍历,再输出后序遍历操作示例