我试图创建一个实现n-ary树的Node类,但我也想跟踪每个节点的父节点,以便追溯到根节点。
class Node(object):
def __init__(self, state, children=None, parent=None):
self.state = state
self.children = children or []
self.parent = parent
def add(self, obj):
self.children.append(Node(obj))
Node(obj).parent = self.state
这就是我一直在研究的问题。但是当我检查查看一个节点的父节点时,它打印的是None。在二进制树中,检查子节点是在左边还是右边很容易,但是对于n-ary树,我不太明白如何去显式地把它作为父节点。
我对Python和编码很陌生,所以如果有人能帮助我,我会非常感激!谢谢你。
EDIT.我在IDE上运行了这样的程序:我在IDE上运行了这样的程序:我在IDE上运行了这样的程序:我在IDE上运行了这样的程序:我在IDE上运行了这样的程序:我在IDE上运行了这样的程序:我在IDE上运行了这样的程序:我在IDE上运行了这样的程序:我在IDE上运行了这样的程序:我在IDE上运行了这样的程序:我在IDE上运行了这样的程序:我在IDE上运行了这样的程序:我在IDE上运行了这样的程序:我在IDE上运行了这样的程序:我在IDE上运行了这样的程序:我在IDE上运行了这样的程序:我在IDE上运行了这样的程序:我在IDE上运行了这样的程序:我在IDE上运行了这样的程序:我在IDE上运行了这样的程序
我在IDE上运行了这个。
>>> n = Node(4)
>>> l = [1,2,3]
>>> for i in l:
n.add_child(i)
>>> n.children.state
Traceback (most recent call last):
File "<pyshell#63>", line 1, in <module>
n.children.state
AttributeError: 'list' object has no attribute 'state'
>>> for child in n.children:
print(child.state)
1
2
3
>>> for child in n.children:
print(child.parent)
None
None
None
>>>
而不是 self.parent = parent
你要做
self.parent = None # for root node only
for child in children:
child.parent = self
self.children.append(Node(obj))
在这里,你是在飞行中创建一个Node实例,并将其追加到子节点列表中。
Node(obj).parent = self.state
那是一个额外的Node实例,你把它的父体赋值为self.state。
我想你想做的是这样的事情,你是在创建一个Node实例,并将其引用存储在变量node中,然后将其父体赋值为当前的Node实例(带有自我引用),并将其引用保存到其子代列表中。
node = Node(obj)
node.parent = self
self.children.append(node)
用这个方法创建一个Node的实例 并把它的引用存储在变量node中 然后把它的父节点指定为当前的Node实例(有自我引用) 并把引用保存到它的子节点列表中。
另外,你也可以这样做。
self.children.append(Node(obj, None, self))
因为你是在构造函数中分配父节点的。