Я (по-прежнему) занимаюсь древовидной структурой в программе Python. Каждый узел в дереве имеет словарь "дети", ключи которого содержат информацию о дуге, а значения - дочерние узлы. (И каждый узел имеет пару (parent, parent_arc), где parent - его родительский узел, а parent_arc - это дуга, по которой родительский узел связывает этот узел.)
Теперь я хочу обрезать поддерево, корень которого является дочерним узлом N. Скажем, что это ребенок N.children [a].
del N.children [a] просто не освободит память, занятую поддеревом. Должен ли я реализовать метод для удаления каждого узла в поддереве? Как я могу это сделать? Нужно ли переопределять класс узлов для эффективного обрезки поддерева?
Спасибо!
Когда 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 быстрее освободит объекты, если не существует ссылочных циклов, он может не вернуть эту память в ОС.