我正在编写一个广度深度优先树遍历函数,我想做的是:
def traverse(node):
yield node
for n in node.children:
yield_all traverse(n) # << if Python had a yield_all statement
这个想法是在树中得到一个(平面)节点序列。
方法#1:(传播收益)
def traverse(node):
yield node
for n in node.children:
for m in traverse(n):
yield m
方法#2:(展平序列)
def traverse(node):
return itertools.chain([node],*(traverse(n) for n in node.children))
第一种方法看起来更干净,但我觉得很奇怪yield
在每个级别的子树中显式地设置每个节点。
第二种方法简洁且略显肮脏,但它符合我在 Haskell 中编写的内容:
traverse node = node : concatMap traverse (children node)
所以我的问题是:哪个更好?还是我错过了最佳的第三选择?