找到二进制树中未包含的最小非负整数

时间:2016-09-12 22:02:34

标签: java algorithm time-complexity binary-tree

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

示例:

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;
    }           
}

2 个答案:

答案 0 :(得分:2)

您应该能够通过遍历树来计算O(n)中树中元素的数量。调用此值x

如果索引值出现在树中,则使用true填充大小为x的布尔数组,否则为false(即bool[y] == true iff y出现在树中)通过遍历树。忽略树yy < 0

中的所有值y >= x

树中不存在的最小非负整数是布尔数组的第一个元素的索引,是假,或者x,如果所有元素都为真。

换句话说,对于任何大小为x的容器,要么:

  1. 其中一个数字0..x-1未包含在树中;或
  2. 树中包含所有数字0..x-1,在这种情况下,树中未包含的最小非负数为x

答案 1 :(得分:1)

假设二叉树遵循所有左边的孩子都比他们的父母小,并且所有正确的孩子都比他们的父亲大,你可以使用树的这个属性来减少你需要搜索的数量。

编辑:由于你的树是通用的,我的直接想法是执行O(n)排序,也许计算排序。然后迭代以找到缺少的最小int。总复杂度O(2n)