我有这段代码可以在Python中实现一棵树。其中一个功能是求下面所有节点(包括其自身)的值之和,但这不起作用。
我认为原因是因为,一旦我创建了一个节点,我就无法返回并使用 Node (name, value) 访问它 - 这将创建一个具有该名称和值的新节点,而不是引用树中具有该名称和值的一个,并且具有与其链接的子级。
因此,sum_below 函数只是返回节点的值。如何引用树中的节点:
class Node(object):
def __init__(self, name, value):
self.name = name
self.value = value
self.children = []
def add_child(self, obj):
self.children.append(obj)
def sum_below(self):
if self.children == []:
return self.value
else:
ret = self.value
for child in self.children:
ret += child.sum_below()
return ret
def __str__(self, level = 0):
ret = "\t"*level+repr(self.value)+"\n"
for child in self.children:
ret += child.__str__(level+1)
return ret
[编辑]我的问题是,一旦创建节点,我就无法引用它:
#In [2]:
Node(1,100)
parent = Node(1,100)
child = Node(2, 200)
parent.add_child(child)
#In [5]:
print parent
#Out [5]:
100
200
#In [6]:
print Node(1,100)
#Out [6]:
100
所以你看,parent 和 Node(1,100) 并没有引用相同的东西。
[编辑]
#In [5]:
parent.sum_below()
#Out[5]:
300
#In [6]:
Node(1,100).sum_below()
#Out[6]:
100
在上面的代码中,Node(1,100).sum_below() 应该等于parent.sum_below(),因为它们应该引用同一个节点,但事实并非如此。
最佳答案
代码看起来没问题。我看到的唯一“不完美”是特殊情况:
if self.children == []: ...
根本不需要。简化版本:
def sum_below(self):
ret = self.value
for child in self.children:
ret += child.sum_below()
return ret
也可以。还可以使用 sum
进一步简化:
def sum_below(self):
return (self.value +
sum(child.sum_below() for child in self.children))
关于Python树实现-节点引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33852659/