/**
* 501. 二叉搜索树中的众数
* @author wsq
* @date 2020/09/24
给定一个有相同值的二叉搜索树(BST),找出 BST 中的所有众数(出现频率最高的元素)。
假定 BST 有如下定义:
结点左子树中所含结点的值小于等于当前结点的值
结点右子树中所含结点的值大于等于当前结点的值
左子树和右子树都是二叉搜索树
例如:
给定 BST [1,null,2,2],
1
\
2
/
2
返回[2].
提示:如果众数超过1个,不需考虑输出顺序
进阶:你可以不使用额外的空间吗?(假设由递归产生的隐式调用栈的开销不被计算在内)
链接:https://leetcode-cn.com/problems/find-mode-in-binary-search-tree
*/
package notsubmit;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
public class FindMode {
/**
* 描述元素出现的频率
*/
private Map<Integer, Integer> freqMap = new HashMap();
/**
* 采用Morris中序遍历
* 由于BFS的中序遍历产生的序列是非递减的,所以可以做下优化,不是用哈希表
* @param root
* @return
*/
public int[] findMode(TreeNode root) {
if(root == null) {
return null;
}
// 遍历二叉树所有的节点,统计元素出现的频率
TreeNode cur = root;
TreeNode mostRight = null;
while(cur != null) {
if(cur.left == null) {
int preNum = freqMap.get(cur.val) == null ? 0 : freqMap.get(cur.val);
freqMap.put(cur.val, ++preNum);
cur = cur.right;
}else {
mostRight = getMostRight(cur);
if(mostRight.right == null) {
mostRight.right = cur;
cur = cur.left;
}else {
countFreq(cur.val);
mostRight.right = null;
cur = cur.right;
}
}
}
ArrayList<Integer> ansList = new ArrayList<Integer>();
int maxVal = -1;
for(Integer k: freqMap.keySet()) {
int val = freqMap.get(k);
if(maxVal == -1) {
ansList.add(k);
maxVal = val;
continue;
}else if(val > maxVal){
ansList.clear();
maxVal = val;
ansList.add(k);
}else if(val == maxVal) {
ansList.add(k);
}
}
int[] ans = new int[ansList.size()];
for(int i=0; i < ansList.size(); ++i) {
ans[i] = ansList.get(i);
}
return ans;
}
public TreeNode getMostRight(TreeNode head) {
TreeNode node = head.left;
while(node.right != null && node.right != head) {
node = node.right;
}
return node;
}
public void countFreq(int val) {
int preNum = freqMap.get(val) == null ? 0 : freqMap.get(val);
freqMap.put(val, ++preNum);
}
public static void main(String[] args) {
}
}
501. 二叉搜索树中的众数
最新推荐文章于 2025-09-18 21:23:54 发布
这篇博客介绍了如何在二叉搜索树中找到出现频率最高的元素(众数)。作者通过实现Morris中序遍历算法,优化了查找过程,避免了使用额外的空间。在遍历过程中,统计每个节点的出现频率,并使用哈希映射存储。最后,通过比较频率找出众数并返回。此方法适用于解决给定的二叉搜索树问题,同时考虑了众数可能存在的多个情况。
620

被折叠的 条评论
为什么被折叠?



