Python 查找树的最大高度并返回该路径的总和
我想先求一棵树的最大高度,然后求它所有节点的和 如果两条路径的高度相同,则只返回总和较大的路径 对不起,我的坏例子。。。我想表达的是一棵像上面这样的树Python 查找树的最大高度并返回该路径的总和,python,Python,我想先求一棵树的最大高度,然后求它所有节点的和 如果两条路径的高度相同,则只返回总和较大的路径 对不起,我的坏例子。。。我想表达的是一棵像上面这样的树 应该有类似于[1,2,无,无],[3,无,无]]的树列表,而不是[1,2,3]这些值是权重吗?树是否以任何方式排序(树是否有特定的顺序) 如果是这样的话,也许你可以做一个修改版本,在每个交叉点取最长的距离,而不是最短的距离,并且使用堆栈代替最小优先级队列,这样你就可以遍历深度优先而不是宽度优先 编辑: 现在我考虑一下,也许使用最大优先级队列会更好
应该有类似于
[1,2,无,无],[3,无,无]]
的树列表,而不是[1,2,3]
这些值是权重吗?树是否以任何方式排序(树是否有特定的顺序)
如果是这样的话,也许你可以做一个修改版本,在每个交叉点取最长的距离,而不是最短的距离,并且使用堆栈代替最小优先级队列,这样你就可以遍历深度优先而不是宽度优先
编辑:
现在我考虑一下,也许使用最大优先级队列会更好。我仍然不确定你想要完成什么。我认为您要求的是最大和的路径,这并不一定意味着它将是节点最多的分支。考虑到每个节点似乎都有权重,节点最多的路径似乎没有意义,因为可能存在权重更大的较短路径。Egg推荐的递归函数:
1
2 3
returns 1 + 3 = 4
例如:
def sum_of_longest_branch(tree):
"""
Parses a tree and returns a tuple containing (depth, sum) of deepest branch.
"""
# stop conditions on leave nodes (can be single [node] or None)
if 1 == len(tree):
return 1, tree[0]
elif None == tree:
return 1, 0
# splitting the branches
else:
# calling the function recursively on all branches branching from current node
branches_sums = [sum_of_longest_branch(branch) for branch in tree[1:]]
# extracting the currently deepest branch
branch, sum = sorted(branches_sums, reverse=True)[0]
# add own node value and one depth before returning
return branch + 1, sum + tree[0]
给出:
tree = [1, [2, [4]], [3, [0]]]
depth, sum = sum_of_longest_branch(tree)
print depth, sum
抱歉,如果它很快又脏,但它可以工作。问题其实并不是那么简单,特别是对于编程/python的初学者来说。我希望这是可以理解的
编辑:现在先检查深度,然后检查总和。请发布您目前拥有的代码,以便我们可以看到您可能正在做的不正确的事情确定递归。这是一个很容易用递归函数解决的问题。似乎有点不必要。无论它们是否为权重,它都是一棵树,简单的遍历不是更简单吗?您只需按顺序遍历树,并记住迄今为止所走的最长路径。我们需要更多信息,如果对树进行排序,我们可以在搜索的每个级别进行选择,并确保路径的总和最大(这是我认为他想要的)还有,什么是“简单”遍历?遍历一棵树有不同的方法,每种方法都有特定的目的。对我来说,任何深度优先遍历似乎都是最简单的方法。最简单的方法并不总是最有效的。如果树有顺序,你可以在搜索的任何给定点对给定的过去/现在信息的总和进行假设,并避免搜索不需要的树的g部分。整棵树上的DFS没有性能。算法的最坏情况复杂度是什么?这会最终遍历整棵树以找出答案吗?代码对我来说很难理解..但我注意到我的树形式完全混乱。它应该是[1,2,3]因为1是根2-左子3-右子和树[1,None,None]意味着它只有根1,没有children@ChristopherPerry:是的,在所有情况下都是:)我只是注意到我没有检查最大的总和和最大的深度(在编辑中更改)。请求的是一个简单的方法,而不是最快的。@user3417260:这毫无意义。。。整个树必须以某种方式包含在单个数据结构中(例如列表)。请编辑并重新表述您的问题。@loli:很抱歉我的错误示例。。。我想表达的是,像1/\23这样的树应该有像
[1,2,None,None],[3,None,None]
这样的树,而不是[1,2,3]
3, 7
def tree_height(tree):
if (isinstance(tree, list)):
tree = tree[1:]
if (tree):
return (1 + max([tree_height(x) for x in tree]))
return 0
def tree_sum(tree):
if tree and (isinstance(tree, list)):
return tree[0] + sum([tree_sum(x) for x in tree[1:]])
return (tree or 0)