501. 二叉搜索树中的众数
程序员文章站
2022-05-20 16:18:05
...
/**
* 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) {
}
}
推荐阅读
-
Java实现的二叉树常用操作【前序建树,前中后递归非递归遍历及层序遍历】
-
Python实现查找二叉搜索树第k大的节点功能示例
-
Java创建二叉搜索树,实现搜索,插入,删除的操作实例
-
Java实现的二叉树常用操作【前序建树,前中后递归非递归遍历及层序遍历】
-
Python中的二叉树查找算法模块使用指南
-
Python利用前序和中序遍历结果重建二叉树的方法
-
Python实现查找二叉搜索树第k大的节点功能示例
-
C语言实现线索二叉树的前中后创建和遍历详解
-
荐 Java刷题笔记15:不同的二叉搜索树( Unique Binary Search Trees)
-
Python实现输入二叉树的先序和中序遍历,再输出后序遍历操作示例