平衡二叉树python

时间:2018-03-21 10:56:50

标签: python binary-search-tree

# 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 的增量,那么看起来我们每次访问节点时都会递增。在我们的例子中,我们每次都访问每个节点。因为在找到正确的节点时停止算法时没有返回条件。

有人可以试着向我解释他们的思考过程。

1 个答案:

答案 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个节点。