2011-08-28 58 views
1

我(仍)正在處理Python程序中的樹結構。 樹中的每個節點都有一個字典「children」,其中的鍵具有弧形信息,值 是子節點。 (並且每個節點都有一個(父,父母)對,其中父母是其父節點,parent_arc是父節點鏈接此節點的弧。)如何修剪python中的子樹

現在我想修剪一棵子樹,一個節點N的孩子。說孩子是N.孩子[a]。

del N.children [a]根本不會釋放子樹佔用的內存。我是否必須實施一種方法來刪除子樹中的每個節點?我怎樣才能做到這一點 ?我是否需要重新定義節點類來進行高效的子樹修剪?

謝謝!

+1

如果N.children [a]擁有其子女,那麼刪除N.children [a]將刪除對這些孩子的所有提及。我沒有看到問題。 –

+0

,但是N.children [a] .children [x]的(parent,parent_arc)對持有對N.children [a]的引用。我想這可以防止節點被刪除。 – justin

+0

我對'parent_arc'術語不熟悉,但是如果您希望對象符合垃圾回收的條件,那麼您只需釋放對它們的所有引用即可。這裏的所有都是它的。 –

回答

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在不存在引用循環的情況下也能更快地釋放對象,它可能不會將該內存返回給操作系統。