遍历非二叉树

时间:2014-12-23 17:32:32

标签: python tree

我试图遍历非二叉树。树的字符串表示形式为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。最后,我想把它变成二叉树,但首先我需要一种方法来遍历树。

2 个答案:

答案 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)

有许多方法可以遍历树。选项包括:

  • 预先遍历 - 发出当前节点,然后递归遍历其子节点
  • 后序遍历 - 递归遍历当前节点,然后发出当前节点
  • 按顺序遍历 - 递归遍历左子项。然后发出当前节点。最后,穿越正确的孩子。表示二叉树,但是如果你有一些方法可以将孩子分成" left"它可以适用于一般树。和"对"基团。

你可以"发出"一个节点通过将其附加到累积列表,但更好的方法是使用生成器和yield节点。

您可以在Wikipedia page on tree traversal找到这些和其他选项。选择一个满足您需求的。