【问题标题】:Python Binary tree search [duplicate]Python二叉树搜索[重复]
【发布时间】:2018-03-21 12:43:11
【问题描述】:
# 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?

谁能解释一下他们的想法。

【问题讨论】:

  • 只有20左右。提示:尝试证明stack_depth的值等于node与根的距离。
  • 我了解你是如何获得 19 的。你几乎可以通过 1+2+4+8+16......... 直到达到 1,000,000。但是我们不是为树中的每个节点都调用 find_in_tree() 并增加 stack_depth 吗?
  • 您可以在下面看到解释您的错误的答案(局部变量)
  • 呃...请不要大喊(大写)。
  • 对不起,我没有大喊大叫,我只是把它放在那里突出显示它。

标签: python recursion binary-tree


【解决方案1】:

要注意的关键是stack_depth 被传递给函数的每个递归调用。如果它是平衡二叉树,那么每次调用find_in_tree 都会将相同的stack_depth 值传递给最多两个孩子。请记住,对stack_depth 的引用不会在随后对find_in_tree 的调用之间共享。他们将拥有自己的stack_depth 版本,并将其初始化为父调用的值。

这应该是足够的信息来确定在断言触发之前应该是什么值。

【讨论】:

  • 非常感谢。我明白了。
  • 现在另一个问题,如果关于树的假设(1,000,000 个节点的上限)是错误的,那么有什么风险发生?程序会因为尝试访问超出限制的内存而崩溃吗?
  • 你可能会得到一个RecursionError,当你达到最大递归深度时会抛出它。你可以自己试试这个简单的程序,比如:def recur(): recur(); recur()
  • 如果你真的需要它运行超过递归限制,你也可以试试raising the recursion limit。但是,如果您真的需要它以更高的递归限制运行(对于平衡的二叉搜索树来说这将是一棵巨大的树),您最好切换到不同的解决方案。
  • 非常感谢您的帮助。
【解决方案2】:

如果您查看 stack_depth 何时增加,那么看起来我们每次访问节点时都会增加。在我们的例子中,我们每次都访问每个节点。因为找到正确节点时停止算法时没有返回条件。

这是不正确的。虽然 a stack_depth 变量会针对每个检查的节点递增,但它不是 same stack_depth 变量。 stack_depth 是函数内的局部变量。当find_in_tree 递归并且递归调用增加stack_depth 时,这不会改变调用者中stack_depth 的值。

stack_depth 正在测量此函数运行完成时发生的递归级别。它所取的最大值将是您正在检查的树的最大深度。

也就是说,如果你只知道你有一百万个节点,你仍然需要将max_stack_depth 步进到一百万,以保证断言不会失败,因为你不知道 形状 em> 树有。可能每个节点都只有一个孩子。在这种情况下,您需要递归大约一百万次(可能是 999,999 次,具体取决于您的计数方式)才能访问每个节点。

当然,在你到达那里之前,Python 会阻止你。

幸运的是,您也知道树是平衡的。这意味着许多节点有两个孩子。这告诉你你会发现的最大深度应该接近节点数的以 2 为底的对数。

【讨论】:

  • “平衡”。 (还有 4 个)
  • 是的,谢谢,已调整。
  • 感谢您的明确回答:)
  • 现在另一个问题,如果关于树的假设(1,000,000 个节点的上限)是错误的,那么有什么风险发生?程序会因为尝试访问超出限制的内存而崩溃吗?
  • 你为什么把这个问题发了两次?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-05
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多