Java 查找二叉树中不包含的最小非负整数

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

该方法返回二叉树中不包含的最小非负整数

例如:

用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(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
iff
y
出现在树中)。忽略树中
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;
        }           
    }