我试图遍历非二叉树。树的字符串表示形式为list
:
[' TOP',[' S',[' NP',[' PRP',' I' ;],[' VP',[' VBP','需要'],[' NP', [' NP',[' DT',' a'],[' NN','航班']] ,[' PP',[' IN','来自'],[' NP', [' NNP','亚特兰大']]],[' PP',[' TO',' to' ],[' NP',[' NP',[' NNP', ' Charlotte'],[' NP',[' NNP',' North'],[' NNP' ,' Carolina']]]],[' NP', [' JJ',' next'],[' NNP','星期一']]]]]]
这来自Penn Treebank。最后,我想把它变成二叉树,但首先我需要一种方法来遍历树。
答案 0 :(得分:5)
def traverse(tree_of_lists):
for item in tree_of_lists:
if isinstance(item, list):
for x in traverse(item):
yield x
else:
yield item
这是"基本"解决方案 - 可以在Python 2.7中运行,并为您提供一个可以简单循环的迭代。 (在最近的Python 3. *版本中,您使用yield from item
而不是内部for
循环。)
isinstance
测试是令人不快的,但根据您的确切问题,它可能是区分标量项目的唯一方法"来自"子树"。可能有更好的但你没有给我们足够的信息来告诉你。例如,如果所有"离开" (标量)是字符串,您可能更愿意检查它(仍然是isinstance
支票,唉!)。
答案 1 :(得分:-3)
有许多方法可以遍历树。选项包括:
你可以"发出"一个节点通过将其附加到累积列表,但更好的方法是使用生成器和yield
节点。
您可以在Wikipedia page on tree traversal找到这些和其他选项。选择一个满足您需求的。