2013-11-27 36 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:经常练习,并尽量牢记数据结构。在节点上需要发生什么以及数据需要去哪里?例如:我是否需要在递归调用中传递信息,以及我需要从递归调用返回哪些信息? –