我正在寻找算法或修改有效方法来获得树深度的总和,例如:
Z
/ \
/ \
/ \
/ \
X Y
/ \ / \
/ \ / \
A B C D
最终的叶子数是4,所以我们有四个最后的总和,它们将分别是这个。
[Z + X + A] [Z + X + B] [Z + Y + C] [Z + Y + D]
如果有人可以指导我找到所有可能深度的总和,那就太棒了。
这将在具有相当大树的python中完成。
答案 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