我正试图找到一种方法来找到不在二进制搜索树中的最小正值([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.我不确定这是否是最好的方法。
感谢您的帮助。
编辑:对不起,我昨晚写了这篇文章,当时我真的很累。我在循环中使用它,所以每次将它放入一个数组会花费太多时间。我正在使用一个二叉搜索树,所以每次循环时我只能插入和删除一次,只需花费最少的时间来查找不在树中的最小值。
答案 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>`.
使用BFS或DFS或任何适合您的方式遍历树。对于树中的每个值v
,将索引v
处的数组更新为:
found[v] = true; //it means value `v` is found in the tree!
一旦你完成了。 i
为found[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)
该算法依赖于每个子树知道它包含多少个节点的概念。