Как удалить поддерево в питоне

1

Я (по-прежнему) занимаюсь древовидной структурой в программе Python. Каждый узел в дереве имеет словарь "дети", ключи которого содержат информацию о дуге, а значения - дочерние узлы. (И каждый узел имеет пару (parent, parent_arc), где parent - его родительский узел, а parent_arc - это дуга, по которой родительский узел связывает этот узел.)

Теперь я хочу обрезать поддерево, корень которого является дочерним узлом N. Скажем, что это ребенок N.children [a].

del N.children [a] просто не освободит память, занятую поддеревом. Должен ли я реализовать метод для удаления каждого узла в поддереве? Как я могу это сделать? Нужно ли переопределять класс узлов для эффективного обрезки поддерева?

Спасибо!

  • 1
    Если N.children [a] владеет своими потомками, то удаление N.children [a] удалит все ссылки на этих потомков. Я не вижу проблемы.
  • 0
    но пара (parent, parent_arc) N.children [a] .children [x] содержит ссылку на N.children [a]. Я предполагаю, что это предотвращает удаление узлов.
Показать ещё 5 комментариев
Теги:
reduce
tree

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 быстрее освободит объекты, если не существует ссылочных циклов, он может не вернуть эту память в ОС.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню