我想解决获取树的高度时的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
。我该如何解决这个问题?
答案 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