使用递归函数获取树的高度

时间:2019-07-19 03:08:53

标签: python python-3.x recursion tree

我想解决获取树的高度时的cousera分配。它要求我通过递归函数获得身高。我写了这个函数,但是我仍然没有得到。第一行中的输入是节点数,第二行是数字列表,每个数字都指向该节点的父节点的索引(-1值表示该节点是根节点)。

我试图打印max_height,它给了我一个数字列表。当我对其进行调试时,我发现它首先可以正常运行,但是在中间流程返回时,值会发生变化。

def compute_height(n, parents, postion=0, hight=0, max_hight=0, current=0):

    if postion == n-1:
        print(max_hight)
        return max_hight

    if current != -1:
        compute_height(n, parents, postion, hight+1,
                       max(max_hight, hight), parents[current])

    compute_height(n, parents, postion+1, 0, max_hight, postion+1)

它返回None。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

似乎您对递归函数感到困惑,并且不知道如何前进。我已对其进行了相当大的更改,以有效地实现了此任务。

通常来说,要解决此类问题,就效率而言,最重要的事情是跟踪您曾经去过的地方,以便您不要< / strong>重复不必要的工作。您还想确保您访问树的每一片叶子,因为您不知道哪一棵是最深的。

这里还使用了两个显然很相关的函数。第一个是 driver (1)函数,当您具有递归(2)函数并希望使用一组特定的参数来启动它时,通常会很有用关。或者,当您想要像我在此处那样在for循环中运行它时。

让我知道是否存在没有意义的东西:

# Computes the height of the tree
def compute_height(n, parents):
    # We make a list to keep track of which nodes have already been visited
    heights = [-1 for x in range(n)]

    # Make sure you visit every node if it is not already visited
    for i, val in enumerate(heights):
        if (val == -1):
            recurse_compute_height(n, parents, i, heights)

    return(max(heights))

# Recursively computes the height for the current node 
def recurse_compute_height(n, parents, index, heights):
    parent = parents[index]

    # Base case for when you reach the root
    if parent == -1:
        return 1

    # Leverage the parent's height, if already computed
    if (heights[parent] != -1):
        heights[index] = heights[parent] + 1
    # Or compute the node's and its parents's height
    else:
        heights[index] = recurse_compute_height(n, parents, parent, heights) + 1

    return heights[index]

# Input and run 
n = 5 
parents = [4, -1, 4, 1, 1, 0]
res = compute_height(n, parents)
print(res)

输出

3