# stack_depth is initialised to 0
def find_in_tree(node, find_condition, stack_depth):
assert (stack_depth < max_stack_depth), 'Deeper than max depth'
stack_depth += 1
result = []
if find_condition(node):
result += [node]
for child_node in node.children:
result.extend(find_in_tree(child_node, find_condition, stack_depth))
return result
我需要帮助理解这段代码。我想回答的问题是
上面的Python函数搜索平衡二叉树的内容。 如果假设上限为1,000,000个节点,那么max_stack_depth常量应该设置为什么?
据我所知,这是一个棘手的问题。如果你考虑一下,每次在递归中调用find_in_tree()函数时,stack_depth都会递增。我们正试图在树中找到一个特定的节点。最糟糕的情况是我们必须在找到它之前搜索树中的所有节点。因此,max_stack_depth应该是1,000,000?
如果你看一下 stack_depth 的增量,那么看起来我们每次访问节点时都会递增。在我们的例子中,我们每次都访问每个节点。因为在找到正确的节点时停止算法时没有返回条件。
有人可以试着向我解释他们的思考过程。
答案 0 :(得分:1)
您必须添加它们,而不是将每个图层上的节点数相乘。例如,前四个图层中的节点数为1+2+4+8=15
,而不是1*2*4*8=64
。
# 1
# # + 2
# # # # + 4
# # # # # # # # + 8 = 15
通常,第一个n
图层中的节点数为2**(n+1)-1
。您可以使用对数来获得正确的功率并获得该数字的最低点。如果你想减少那个数字,你还必须从功率中减去一个。
>>> math.floor(math.log(1000000, 2))
19
>>> sum(2**i for i in range(1, 20))
1048574
关于您的编辑:是的,stack_depth
随每个节点递增,但您正在递增本地变量。增量将传递给子节点(作为参数传递)但不传递给兄弟节点,即n
级别的所有节点都将使用stack_depth == n-1
调用(假设它以0
开头在第一级)。因此,max_stack_depth
应为19
(如果以20
开头,则为1
),以访问树的前19个级别中的~1,000,000个节点。