Java 查找二叉树中不包含的最小非负整数
该方法返回二叉树中不包含的最小非负整数 例如: 用0 1 2 3返回4 用1234返回0 用0 1 2 5 6返回3 与6 1 5 2返回3 我的解决方案的复杂性是O(n^2)。如何在不超过O(n)的时间内解决Java 查找二叉树中不包含的最小非负整数,java,algorithm,time-complexity,binary-tree,Java,Algorithm,Time Complexity,Binary Tree,该方法返回二叉树中不包含的最小非负整数 例如: 用0 1 2 3返回4 用1234返回0 用0 1 2 5 6返回3 与6 1 5 2返回3 我的解决方案的复杂性是O(n^2)。如何在不超过O(n)的时间内解决 publicstatic int minIntNotContains(BinTree节点){ 列表a=新的ArrayList(); int min=minIntNotContainsRic(节点,a); 返回最小值; } 公共静态int minIntNotContainsRic(BinT
publicstatic int minIntNotContains(BinTree节点){
列表a=新的ArrayList();
int min=minIntNotContainsRic(节点,a);
返回最小值;
}
公共静态int minIntNotContainsRic(BinTree节点,列表a){
int min=node.getValue().getValue();
a、 添加(node.getValue().getValue());
if(node.getLeftSubtree()!=null){
min=Math.min(min,minIntNotContainsRic(node.getLeftSubtree(),a));
}
if(node.getRightSubtree()!=null){
min=Math.min(min,minIntNotContainsRic(node.getRightSubtree(),a));
}
如果(最小值>0),则返回0;
否则{
对于(int i=0;i,假设二叉树遵循所有左侧子树都小于其父树且所有右侧子树都大于其父树,则可以使用树的此属性来减少需要搜索的数量
编辑:由于您的树是泛型的,我的直接想法是执行O(n)排序,可能是计数排序。然后迭代查找缺失的最小整数。总复杂性O(2n)您应该能够通过遍历树来计算O(n)中树中的元素数。将此值称为x
如果索引值出现在树中,则用true填充大小为x
的布尔数组,否则用false填充(即bool[y]==true
iffy
出现在树中)。忽略树中y<0
或y>=x
的所有值
树中不存在的最小非负整数要么是布尔数组中第一个元素的索引为false,要么是x
(如果所有元素均为true)
换言之,对于任何大小为x
的容器:
树中不包含一个编号0..x-1
;或
树中包含所有编号0..x-1
,在这种情况下,树中未包含的最小非负数为x
为什么1 2 5 6
不返回0?你怎么知道这是O(n^2)?为什么你需要在每次递归调用中循环列表?它是一个特殊的二叉树,如搜索树?还是仅仅是任何二叉树?0是非负的。如果你的意思是正的,为什么1 2 3 4
返回0?如果0表示“没有丢失的整数”,为什么0 1 2 3
返回4?那么答案是空间和时间复杂度θ(N),因为您总是需要遍历整个树,因为无法推断较低级别(您不知道较低级别的值或树的任何部分)这是大量不必要的工作(同样:一次遍历足以收集最低的非负数)。我也对这种方法感到困惑:如果索引值出现在树中
?这是否意味着您需要一个size=max(树中的值)的布尔数组?如果存在1e10值,这将耗尽内存。数组只需与树中的元素数相同大小,与注释中的O(n)空间要求一致。希望了解如何一次完成此操作。如果更新当前候选值足够,为什么要排序?这是大量不必要的工作!
public static <E> int minIntNotContains(BinTree<Nodo<Integer>> node) {
List<Integer> a=new ArrayList<Integer>();
int min=minIntNotContainsRic(node,a);
return min;
}
public static <E> int minIntNotContainsRic(BinTree<Nodo<Integer>> node,List<Integer> a) {
int min= node.getValue().getValue();
a.add(node.getValue().getValue());
if(node.getLeftSubtree() != null) {
min = Math.min(min, minIntNotContainsRic(node.getLeftSubtree(),a));
}
if(node.getRightSubtree() != null) {
min = Math.min(min, minIntNotContainsRic(node.getRightSubtree(),a));
}
if (min>0) return 0;
else{
for (int i=0;i<a.size();i++){
if (!a.contains(i+1)){
return i+1;
}
}
return min;
}
}