我们怎样才能找到BST中最常出现的元素?我想过用hash-map实现它。有什么简单的方法吗?
答案 0 :(得分:7)
此问题等同于在排序数组中查找最常见的元素 - 应用相同的算法:
唯一的区别是,不是使用循环遍历数组,而是使用递归函数进行树遍历。在这两种情况下,算法在树中的元素数量上是线性的。如果树是平衡的,则算法在调用堆栈上需要O(LogN)
空间。
答案 1 :(得分:2)
可以通过多种方式完成 -
time O(n) space O(n)
O(n)
和空间O(n)
但实际上,如果数据集有大量重复,这种方法应占用更少的空间。答案 2 :(得分:0)
这是最干净的方法:
您可以就地执行此操作(O(1)
额外的内存复杂性):
保持2 O(1)
个变量表示最大出现次数和元素,按顺序迭代树,以保证它以递增方式递增,并更新元素最大出现次数:
curmax = 0
maxnode = null
for each node in BST.inorder():
if next.value == node.value:
max ++
else:
max = 1
if max > curmax:
curmax = max
maxnode = node
答案 3 :(得分:0)
我们可以使用修改后的inorder遍历,并跟踪前一个元素。
TreeNode prev = null;
int count = 1, max = 0;
List<Integer> list = new ArrayList<>();
private void inorder(TreeNode root) {
if (root == null) return;
inorder(root.left);
if (prev != null) {
if (root.val == prev.val)
count++;
else
count = 1;
}
if (count > max) {
max = count;
list.clear();
list.add(root.val);
} else if (count == max) {
list.add(root.val);
}
prev = root;
inorder(root.right);
}
由于inorder遍历为我们提供升序的元素,这种技术很有用,这里的列表将包含这些元素。