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时,重复项丢失,因此它看起来是理想的答案。这很难在评论中解释,所以如果这不合理,请告诉我,我们可以改变对话。