【问题标题】:Balanced binary tree python平衡二叉树python
【发布时间】:2018-08-30 11:08:17
【问题描述】:
# 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 何时增加,那么看起来我们每次访问节点时都会增加。在我们的例子中,我们每次都访问每个节点。因为找到正确节点时停止算法时没有返回条件。

有人能解释一下他们的想法吗?

【问题讨论】:

  • 您的问题似乎是关于二叉树数据结构作为 CS 中的一个概念,而不是任何与之相关的特定编程挑战。我想说这个问题与 StackOverflow 无关,应该在 cs.stackexchange.com 上提问。
  • 为什么是1x2x4x...?不应该是1+2+4+...吗?当然,前 7 层中没有一百万个节点。

标签: python binary-search-tree


【解决方案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 随着每个节点的增加而增加,但您正在增加一个 local 变量。增量将传递给子节点(作为参数传递)但不传递给兄弟节点,即n 级别的所有节点将使用stack_depth == n-1 调用(假设它在第一级以0 开始)。因此,max_stack_depth 应该是 19(或 20,如果它以 1 开头)来访问树的前 19 级中的约 1,000,000 个节点。

【讨论】:

  • 也许,我认为我最初认为的一切都不正确。这更像是一个技巧问题。答案是 1,000,000。
  • 如果你仔细想想,在递归中每次调用 find_in_tree() 函数时,stack_depth 都会递增。我们正试图在树中找到一个特定的节点。所以最糟糕的情况是我们必须在找到它之前搜索树中的所有节点。因此,1,000,000?
  • @NipoonPatel 不,如果树只包含 1000000 个元素,或者算法应该只访问 1000000 个节点,那么这 1000000 个节点将全部位于树的前 19 个级别。 1000000 的深度只有在算法只访问一个通过节点的“路径”时才有意义(正如正确的二进制搜索所做的那样,但您的算法会访问 所有 子节点)
  • 是的,正如您所说的“我的算法访问所有子节点”,所以如果您查看 stack_depth 何时增加,那么看起来我们每次访问节点时都会增加。在我们的例子中,我们正在访问每个节点。因为找到正确节点时停止算法时没有返回条件。如果你明白我的意思。
  • 所以 max_stack_depth 的值应该是 1,000,000。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-13
  • 1970-01-01
  • 1970-01-01
  • 2015-01-08
  • 2013-12-18
相关资源
最近更新 更多