2013-11-27 62 views
1

我試圖在Python中實現Tree,我發現this線程,並嘗試工作我自己的樹,但我被困在如何添加大孩子。如何將孫子添加到python樹?

我試圖構建樹是這樣的:

Root 
    ch1 
     ch2 
      ch3 
      ch4 

所以我想通了add_child()方法應該是遞歸的:

1,如果樹一直沒有孩子,加上孩子的根

2,對於Root的每個孩子,如果其中一個孩子等於parent,則向其添加孩子並停止循環(因此新孩子實際上是一個大孩子)。

3,如果沒有匹配,請撥打add_child()對當前的孩子。

但我的代碼給我:

Root 
    ch1 
     ch2 
      ch3 
       ch4 

順便說一句,每次我用遞歸算法我感到困惑的工作,任何人都可以給我如何編寫代碼遞歸一些好的建議?還是有什麼好的教程?

class Node(object): 
    def __init__(self, data, parent=None): 
     self.data = data 
     self.children = [] 
     self.parent = parent 

    def __repr__(self, level=0): 
     ret = "\t" * level + repr(self.data) + "\n" 
     for child in self.children: 
      ret += child.__repr__(level + 1) 
     return ret 

    def add_child(self, node, parent): 

     if self.children == []: 
      self.children.append(node) 
      return 

     for child in self.children: 
      if child == parent: 
       child.children.append(node) 
       return 
      else: 
       child.add_child(node, parent) 

     # self.children.append(node) 


if __name__ == '__main__': 

    tree = Node('Root') 
    tree.add_child(Node('ch1'), 'Root') 
    tree.add_child(Node('ch2'), 'ch1') 
    tree.add_child(Node('ch3'), 'ch2') 
    tree.add_child(Node('ch4'), 'ch2') 
    print tree 

回答

1

下面的部分是沒有意義的:

if self.children == []: 
    self.children.append(node) 
    return 

如果一個節點沒有孩子會自動將節點添加到該節點?如果節點應該添加到不同的父節點呢?

你大概意思寫:

def add_child(self, node, parent): 
    if self.data == parent: 
     self.children.append(node) 
     return 
    for child in self.children: 
     child.add_child(node, parent) 

產生樹如預期。

+0

它的工作原理!謝謝,btw可以給我一些關於編寫/調試遞歸程序的建議嗎?任何事情都會有所幫助,我對此感到非常沮喪...... – shengy

+0

@shengy:經常練習,並儘量牢記數據結構。在節點上需要發生什麼以及數據需要去哪裏?例如:我是否需要在遞歸調用中傳遞信息,以及我需要從遞歸調用返回哪些信息? –