1

我(仍在)处理 Python 程序中的树结构。树中的每个节点都有一个字典“children”,其键保存弧信息,值是子节点。(并且每个节点都有一个 (parent, parent_arc) 对,其中 parent 是它的父节点,而 parent_arc 是父节点链接该节点的弧。)

现在我想修剪一个子树,它的根是节点 N 的子节点。假设子节点是 N.children[a]。

del N.children[a] 根本不会释放子树占用的内存。我是否必须实现一种方法来删除子树中的每个节点?我怎样才能做到这一点 ?我是否需要重新定义节点类以进行有效的子树修剪?

谢谢!

4

1 回答 1

2

当 A -> B 和 B -> A 你有参考周期。解决这个问题的一个好方法是让子级使用弱引用来指向父级。像这样的东西:

import weakref
class Node():
    parent = None
    child = None
    @property
    def parent(self):
        parent = self._parent()
        if parent is not None:
            return parent
        raise ValueError("parent has been deleted")
    @parent.setter     # python 2.6+
    def parent(self, parent):
        self._parent = weakref.ref(parent)

现在,该节点没有直接链接到其父节点,当您删除子节点时,它真的会消失*。(您可能需要对 parent_arc 使用相同的方法。)

*请注意,即使在不存在引用循环的情况下,Python 会更快地释放对象,但它可能不会将该内存返回给操作系统。

于 2011-08-28T13:21:48.083 回答