【问题标题】:How to access parent of a node in n-ary tree?如何访问n叉树中节点的父节点?
【发布时间】:2020-05-24 01:02:02
【问题描述】:

我正在尝试创建一个实现 n 叉树的 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

这就是我一直在做的事情。但是当我查看节点的父节点时,它会打印无。在二叉树中,检查孩子是在左边还是右边很容易,但对于 n 叉树,我真的不明白如何明确地将其设为父节点。

我对 Python 和编码还很陌生,所以如果有人能提供帮助,我将不胜感激! 谢谢!

编辑:

我在 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
>>> 

【问题讨论】:

  • 你能写下你是如何使用它的,你是如何检查父母的
  • @ashishsingh 我已经进行了编辑。你可以看看。
  • 我已经写了一个答案..请检查

标签: python class tree nodes parent


【解决方案1】:

而不是 self.parent = parent

你想做的事

self.parent = None # for root node only

for child in children:
  child.parent = self

【讨论】:

  • 代码中的这种更改是在初始化中完成还是在 add() 函数中完成?如果我这样做,我是否需要保留“父”作为 init 的参数?
  • 这是用于构造函数的,add 函数也应该改变。请注意,在add 中,您正在创建两个不同的节点。即..您正在向子数组添加一个节点,但您将父节点设置在完全不同的节点上
  • 只是为了澄清,使用 Node(obj).parent = self.state 时如何将父节点设置在完全不同的节点上?
  • Node(obj) 每次调用都会创建一个新节点
  • 所以我应该只做 obj.parent = self?
【解决方案2】:
self.children.append(Node(obj))

在这里,您正在动态创建一个 Node 实例并将其附加到子列表中

Node(obj).parent = self.state

这是一个额外的 Node 实例,您将它的父级分配为 self.state

我认为你正在尝试做这样的事情:

node = Node(obj)
node.parent = self
self.children.append(node)

这样,您将创建一个 Node 实例并将其引用存储在变量 node 中,然后将其父级分配为当前 Node 实例(带有自身引用)并将引用保存到其子级列表。

另外,你可以这样做:

self.children.append(Node(obj, None, self))

因为您在构造函数中分配父级。

【讨论】:

    猜你喜欢
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多