Python将列表转换为树表示格式

时间:2014-06-20 19:12:57

标签: python list binary-tree prefix-sum

我和我的朋友正在开发一个简单的Python项目。实际上我们正在以自己的方式实现前缀并行和算法。

我们正在使用非常奇怪的格式创建和处理二叉树。我们希望将此格式转换为Tree打印库/软件(如ete2)所接受的格式。

因此,树的每个级别都以这种方式被推入列表中

[ [level0], [level1], ... [level i-1], [root] ]

在我们的格式中,每个内部列表(树的级别)都有偶数个节点或叶子。

例如,假设我们有这样的输入:[1, 2, 3, 4, 5]。这将生成以下输出列表:[[1, 2, 3, 4], [3, 7], [10, 5], [15]]

上述输出示例的问题是有时候叶子不在最后一级,但它们包含在上级列表中。这使得难以处理列表列表并将节点与叶子区分开来,并将它们排列在正确的位置。

我们希望将其可视化如下:

http://i.imgur.com/BKrqNZi.png

括号中包含的数字是节点而其他数字则留下。

为了生成这个输出树,我们想使用一个Tree绘图库。他们中的大多数都期望这种格式:[root, [left], [right]]

因此,在我们的示例中,我们的格式应该是这样的:

[15, [10, [3, [1], [2]], [7, [3], [4]] ], [5] ]

因为我们现在不能重写我们代码的整个逻辑,所以我们正在寻找一种智能的方法将我们奇怪的格式转换为那种格式。

欢迎任何想法。 非常感谢你提前。

1 个答案:

答案 0 :(得分:3)

您可以利用以下事实:对于您的树的行r,col c中的元素,左右子元素位于c*2和{{1如果存在这些元素,则分别为下一行(否则该节点为叶子)。把它放到算法中:

c*2+1

示例:

def normalize(tree, row=0, col=0):
    try:
        node = tree[row][col]
        left  = normalize(tree, row+1, col*2)
        right = normalize(tree, row+1, col*2+1)
        return [node, left, right] if left or right else [node]
    except:
        return None # child index does not exist