最小值不在二叉树中?

时间:2013-01-28 06:56:14

标签: c++ c algorithm binary-tree

我正试图找到一种方法来找到不在二进制搜索树中的最小正值([0,INT_MAX))(最大整数)值。树具有所有正整数。我正想着穿过树的左侧。然后创建一个结构值struct { int data; bool found; };,如果它是最小值,我返回t/f

我是通过遍历左侧,如果root-> data + 1>来完成此操作的。 left-> data,然后返回

  

left-> data + 1

,否则就对了。然后,如果

  

root-> data + 1<右>数据

,然后return root->data + 1。否则返回root->data or right->data如果right不为null,则找到的值为false。我还必须考虑树中的最小值是否为0,然后返回0.我不确定这是否是最好的方法。

感谢您的帮助。

编辑:对不起,我昨晚写了这篇文章,当时我真的很累。我在循环中使用它,所以每次将它放入一个数组会花费太多时间。我正在使用一个二叉搜索树,所以每次循环时我只能插入和删除一次,只需花费最少的时间来查找不在树中的最小值。

2 个答案:

答案 0 :(得分:4)

以下是您可以遵循的步骤:

  • 声明类型为max_int的大小为bool的数组,并使用false初始化所有元素。

    bool found[max_int] = {}; //it initializes the array with false!
    //assumming `max_int` is a constant expression.
    //else you can use `std::vector<bool>` or `std::vector<char>`.
    
  • 使用BFSDFS或任何适合您的方式遍历树。对于树中的每个值v,将索引v处的数组更新为:

    found[v] = true; //it means value `v` is found in the tree!
    

一旦你完成了。 ifound[i]的最低索引false是您要查找的值。也就是说,i是不在树中的最小值。

请注意,二叉树二叉搜索树之间存在差异。我的解决方案适用于二叉树,但 也适用于二叉搜索树。只是在二叉搜索树的情况下,您可以找到更优的解决方案,例如,遍历您可以忽略具有更大值的分支。我希望你能自己做到。

答案 1 :(得分:3)

假设您的树不包含重复值,您可以执行树的有序遍历。第一个访问节点的期望值是0.每个后续访问节点的期望值比最后访问的节点大一个。如果遇到与预期值不同的节点,则预期值是查询的答案。

我假设您的树是按照您描述遍历的方式订购的。如果未对树进行排序,则需要访问每个节点以确定答案,但您可以忽略任何高于树中节点数的值。

虽然上面提供了BST的线性解决方案,但您可以更多地利用结构来获得平均的对数解。假设左和右节点是真正的子树,那么算法将是:

MinMissingValue(BST t, integer b = 0):
    if (t is empty) return b;
    if (t.root.value - b) > t.root.left.count
        return MinMissingValue(t.root.left, b)
    else
        return MinMissingValue(t.root.right, t.root.value + 1)

该算法依赖于每个子树知道它包含多少个节点的概念。