所以我用python创建了一棵树。我正在尝试更改根节点的每个子节点的某些值。但是,我树中的每个节点都没有受到攻击。
class Node(object):
def __init__(self, value, priority):
self.parent = None
self.children = []
self.value = value
self.priority = priority
def add_child(self, obj):
self.children.insert(obj)
obj.parent = self
def getChildren(self):
return self.children.getAll()
tom = Node("DD",1)
tom.add_child(Node("a",0.3))
tom.add_child (Node("b", 0.6))
tom.getChildren()[0].add_child(Node("c",1))
tom.getChildren()[1].add_child(Node("d",1))
#print(tom.popHighestValue().value)
def getAll(currentNode):
print(currentNode.value)
if(currentNode.getChildren != []):
for sibling in currentNode.getChildren():
sibling.priority = 1
return getAll(sibling)
树应该看起来像:
DD
/\
a b
/
c
但是只有DD-> a-> c被击中。我认为遍历DD-> c之后,将保存并继续for循环状态。
目标是击中树中的每个节点。并将优先级值设置为1。
答案 0 :(得分:0)
return
语句始终退出当前函数。如果执行此操作时处于循环中,则循环的其余部分将永远不会执行。
如果您需要返回所有递归调用的值,则需要在循环过程中将它们收集在一个列表中,然后在循环完成后返回该列表。
但是在这种情况下,您似乎不需要退货。此功能仅用于设置属性,没有提取任何内容。因此,只需进行递归调用就不会返回。
def getAll(currentNode):
print(currentNode.value)
for sibling in currentNode.getChildren():
sibling.priority = 1
getAll(sibling)
顺便说一句,这不会设置根节点的优先级,因为它只会设置子级的优先级。如果要包括根节点,则应为:
def getAll(currentNode):
print(currentNode.value)
currentNode.priority = 1
for sibling in currentNode.getChildren():
getAll(sibling)
此外,您不应在getAll()
方法中调用getChildren()
。它只会返回self.children
,而不是self.children.getAll()
。
答案 1 :(得分:0)
如果您在调用getAll()
之前删除了返回值,并将其放置在封闭的for循环之外,则可以解决您的问题。
在您的代码中,您无法处理所有子项,因为在第一次迭代后,您立即使用getAll()
语句调用return
。因此,除第一个兄弟姐妹外,其他所有兄弟姐妹都不会/不会在每个深度进行探索。