每个深度的二叉树遍历总和

时间:2014-12-22 00:09:52

标签: python algorithm recursion binary-tree

我正在寻找算法或修改有效方法来获得树深度的总和,例如:

                Z
               / \
              /   \
             /     \
            /       \
           X         Y
          / \      /  \
         /   \    /    \
        A     B  C      D

最终的叶子数是4,所以我们有四个最后的总和,它们将分别是这个。

[Z + X + A] [Z + X + B] [Z + Y + C] [Z + Y + D]

如果有人可以指导我找到所有可能深度的总和,那就太棒了。

这将在具有相当大树的python中完成。

2 个答案:

答案 0 :(得分:1)

您可以递归树的节点,保持从根到这一点的总和。到达叶节点时,将在一个元素的列表中返回当前总和。在内部节点中,您可以连接从子节点返回的列表。

示例代码:

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]

答案 1 :(得分:0)

这是您正在寻找的。在这个例子中,树被存储为带有“值”和“子”键的dicts,“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