Python 每个深度的二叉树遍历和
我正在寻找一种算法或对一种有效方法的修改,以获得树深度的遍历总和,例如:Python 每个深度的二叉树遍历和,python,algorithm,recursion,binary-tree,Python,Algorithm,Recursion,Binary Tree,我正在寻找一种算法或对一种有效方法的修改,以获得树深度的遍历总和,例如: Z / \ / \ / \ / \ X Y / \ / \ / \ / \ A B C D 最后的叶子数是四,所以我们有
Z
/ \
/ \
/ \
/ \
X Y
/ \ / \
/ \ / \
A B C D
最后的叶子数是四,所以我们有四个最后的和,它们分别是这个
[Z+X+A][Z+X+B][Z+Y+C][Z+Y+D]
如果有人能引导我在正确的方向上获得所有可能深度的总和,那就太好了
这将在具有相当大的树的python中完成。以下是您要查找的内容。在本例中,树存储为dict,带有“value”和“children”键,“children”映射到列表
def triesum(t):
if not t['children']:
return [t['value']]
return [t['value'] + n for c in t['children'] for n in triesum(c)]
范例
trie = {'value': 5, 'children': [
{'value': 7, 'children': [
{'value': 8, 'children': []},
{'value': 2, 'children': []}
]},
{'value': 4, 'children': [
{'value': 3, 'children': []},
{'value': 6, 'children': []}
]}
]}
print sorted(triesum(trie)) == sorted([5 + 7 + 8, 5 + 7 + 2, 5 + 4 + 3, 5 + 4 + 6])
# prints True
您可以在树的节点上递归,保持从根到这一点的总和。到达叶节点时,返回一个元素列表中的当前和。在内部节点中,连接从子节点返回的列表 示例代码:
class Node:
def __init__(self, value, children):
self.value = value
self.children = children
def tree_sums(root, current_sum):
current_sum += root.value
if len(root.children) == 0:
return [current_sum]
subtree_sums = []
for child in root.children:
subtree_sums += tree_sums(child, current_sum)
return subtree_sums
tree = Node(1, [Node(2, []), Node(3, [])])
assert tree_sums(tree, 0) == [3, 4]
你想寻找一个有效的dfs算法优秀的,你能给我一个可以输入算法的示例树目录吗?添加了我用来测试它的示例我给了你一个最具python风格的答案,但是因为它访问了没有的孩子,你将有两倍的总和。在测试过程中,当我使用集合而不是列表时,这被弄糊涂了。你可能对一个答案更感兴趣,这个答案不是一行,但不会访问任何儿童。它给出的总数是预期的两倍吗?如果示例打印为true,这就是我想要的,对吗?在您的示例中,如果节点X的值为5,A和B的值为None,那么理想情况下,子树将返回[5],但在我的算法中,由于基况,它将返回[5+0,5+0]。因此,该算法将在平衡树上均匀地添加重复项。当我键入convert to set时,重复项丢失,因此它看起来是理想的答案。这很难在评论中解释,所以如果这不合理,请告诉我,我们可以改变对话。