给定一个有相同值的二叉搜索树(BST),找出 BST 中的所有众数(出现频率最高的元素)。
假定 BST 有如下定义:
结点左子树中所含结点的值小于等于当前结点的值
结点右子树中所含结点的值大于等于当前结点的值
左子树和右子树都是二叉搜索树
例如:
给定 BST [1,null,2,2],
1 \ 2 / 2
进阶:你可以不使用额外的空间吗?(假设由递归产生的隐式调用栈的开销不被计算在内)
思路 + 代码
morris 中序遍历 可参考 Morris遍历(二叉树)
class Solution {
int maxCount = 0;
int count = 0;
int lastNum;
List<Integer> list = new ArrayList();
public int[] findMode(TreeNode root) {
if (root == null) return new int[0];
lastNum = root.val + 1;
inOrderMorris(root);
int[] res = new int[list.size()];
for (int i = 0; i < list.size(); i++)
res[i] = list.get(i);
return res;
}
public void inOrderMorris(TreeNode node){
while (node != null) {
if (node.left == null){
updateMode(node.val);
node = node.right;
continue;
}
TreeNode pre = node.left;
while (pre.right != null && pre.right != node) pre = pre.right;
if (pre.right == null){
pre.right = node;
node = node.left;
}else{
updateMode(node.val);
node = node.right;
}
}
}
// 更新众数
public void updateMode(int value){
if (value == lastNum) count++;
else {
lastNum = value;
count = 1;
}
if (count == maxCount){
list.add(value);
}else if (count > maxCount){
maxCount = count;
list.clear();
list.add(value);
}
}
}