Recursively sum and print all nodes names and values from a tree in Python

混江龙づ霸主 提交于 2020-07-22 05:57:09

问题


I have found the code from this link:

class Node:
    def __init__(self, name, weight, children):
        self.children = children
        self.weight = weight
        self.weight_plus_children = weight

    def get_all_weight(self):
        if self.children is None:
          return self.weight_plus_children
        else:
          for child in self.children:
            print("child.get_all_weight()", child.get_weigth_with_children())
            self.weight_plus_children += child.get_weigth_with_children()

        return self.weight_plus_children

    def get_weigth_with_children(self):
        return self.weight_plus_children

leaf1 = Node('C1', 58, None)
leaf2 = Node('C2', 7, None)
leaf3 = Node('C3', 10, None)
leaf4 = Node('C4', 20, None)

subroot = Node('B1', 50, [leaf1, leaf2])
subroot1 = Node('B2', 50, [leaf3, leaf4])

root = Node('A', 100, [subroot, subroot1])

print(subroot.get_all_weight())
print(subroot1.get_all_weight())
print(root.get_all_weight())

Out:

child.get_all_weight() 58
child.get_all_weight() 7
115
child.get_all_weight() 10
child.get_all_weight() 20
80
child.get_all_weight() 115
child.get_all_weight() 80
295

Now, instead of child.get_all_weight(), I hope to show the nodes names on the output:

How could I generate a similar result as follows (not necessary to be exact same if it's difficult to realize)?

Value of leaf C1: 58
Value of leaf C2: 7
Sum of nodes B1: 115

Value of leaf C3: 10
Value of leaf C4: 20
Sum of nodes B2: 80

Sum of nodes A: 295

Thanks a lot at advance.


回答1:


from collections import deque

class Node:
    def __init__(self, name, weight, children):
        self.name = name
        self.children = children
        self.weight = weight
        self.weight_plus_children = weight

    def get_all_weight(self):
        if self.children is None:
          return self.weight_plus_children
        for child in self.children:
            self.weight_plus_children += child.get_all_weight()
        return self.weight_plus_children

    
def print_tree(root: Node):
    queue = deque()
    queue.append(root)
    while queue:
        front = queue.popleft()
        print('{} = {}'.format(front.name, front.weight_plus_children))
        if front.children:
            for child in front.children:
                if child is not None:
                    queue.append(child)


leaf1 = Node('C1', 58, None)
leaf2 = Node('C2', 7, None)
leaf3 = Node('C3', 10, None)
leaf4 = Node('C4', 20, None)

subroot = Node('B1', 50, [leaf1, leaf2])
subroot1 = Node('B2', 50, [leaf3, leaf4])

root = Node('A', 100, [subroot, subroot1])

root.get_all_weight()

print_tree(root)

Output:

A = 295
B1 = 115
B2 = 80
C1 = 58
C2 = 7
C3 = 10
C4 = 20


来源:https://stackoverflow.com/questions/62906391/recursively-sum-and-print-all-nodes-names-and-values-from-a-tree-in-python

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!