2014-11-02 53 views
0

我有这样的代码打印每个节点的数据树:打印树,而无需递归

class Node: 
    def __init__(self,data, children=[]): 
     self.data = data 
     self.children = children 
    def __repr__(self): 
     return str(self.data) 

n1 = Node(1) 
n2 = Node(2) 
n3 = Node(3) 
n4 = Node(4) 
n5 = Node(5) 
n6 = Node(6) 
n7 = Node(7) 


n1.children=[n2,n3,n4] 
n3.children = [n5,n6] 
n6.children=[n7] 

def print_rec(node): 
    print node 
    if not node.children: return 
    for c in node.children: 
     printer(c) 

我怎么能不写使用递归的方法print_rec?

回答

2

你会使用一个队列还是跟踪结点要处理,增加了它,你处理它们:

def print_nonrec_breathfirst(node): 
    queue = [node] 
    while queue: 
     node, queue = queue[0], queue[1:] 
     print node 
     for c in node.children: 
      queue.append(c) 

或者你可以使用一个堆栈,处理儿童第一:

def print_nonrec_depthfirst(node): 
    stack = [node] 
    while stack: 
     node = stack.pop() 
     print node 
     for c in node.children: 
      stack.append(c) 

无论哪种方式,你跟踪你还没有打印的内容节点,你处理您找出子节点,你仍然需要处理的节点。

演示:

>>> print_nonrec_breathfirst(n1) 
1 
2 
3 
4 
5 
6 
7 
>>> print_nonrec_depthfirst(n1) 
1 
4 
3 
6 
7 
5 
2 
+0

这是伟大的工程。但是,有没有更“简单”(容易掌握)的方法来做到这一点? – Kipi 2014-11-02 13:58:51

+1

@Kipi唔......递归;-) – uselpa 2014-11-02 14:40:26

+1

'如果不是node.children:continue'没有意义 - 当'node.children'为空的列表/元组时,for的主体在它不会被执行之后。 – GingerPlusPlus 2014-11-02 14:40:26