该方法返回二叉树中未包含的最小非负整数。
示例:
0 1 2 3返回4.
以1 2 3 4返回0。
0 1 2 5 6返回3.
以6 1 5 2返回3.
我的解决方案的复杂性是O(n ^ 2)。我怎么能在不超过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;
}
}
答案 0 :(得分:2)
您应该能够通过遍历树来计算O(n)中树中元素的数量。调用此值x
。
如果索引值出现在树中,则使用true填充大小为x
的布尔数组,否则为false(即bool[y] == true
iff y
出现在树中)通过遍历树。忽略树y
或y < 0
。
y >= x
树中不存在的最小非负整数是布尔数组的第一个元素的索引,是假,或者x
,如果所有元素都为真。
换句话说,对于任何大小为x
的容器,要么:
0..x-1
未包含在树中;或0..x-1
,在这种情况下,树中未包含的最小非负数为x
。答案 1 :(得分:1)
假设二叉树遵循所有左边的孩子都比他们的父母小,并且所有正确的孩子都比他们的父亲大,你可以使用树的这个属性来减少你需要搜索的数量。
编辑:由于你的树是通用的,我的直接想法是执行O(n)排序,也许计算排序。然后迭代以找到缺少的最小int。总复杂度O(2n)