【问题标题】:Python convert list to tree representation formatPython将列表转换为树表示格式
【发布时间】:2014-08-11 14:49:12
【问题描述】:

我和我的朋友正在开发一个简单的 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] ]

因为我们目前无法重写代码的整个逻辑,所以我们正在寻找一种聪明的方法将我们奇怪的格式转换为那个格式。

欢迎任何想法。 非常感谢您。

【问题讨论】:

    标签: python list binary-tree prefix-sum


    【解决方案1】:

    您可以利用这样一个事实,即对于树的r、colc 行中的元素,左右子元素分别位于下一行的c*2c*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
    

    例子:

    >>> tree = [[1, 2, 3, 4], [3, 7], [10, 5], [15]]
    >>> print normalize(tree[::-1]) # reverse the list!
    [15, [10, [3, [1], [2]], [7, [3], [4]]], [5]]
    

    【讨论】:

    • 哇!我无法表达我的感激之情!您刚刚用 5 行代码解决了我们的问题!这太棒了,非常感谢您,先生。老实说,我们尝试使用与您想像的模式完全相同的方式来处理它,但是我们的 python + 编码技能并不是那么好,而且我们的实现中存在错误。再次,非常感谢它真的有帮助!请有人代表我投票赞成 tobias_k,因为由于缺乏声誉,我无法做到这一点:S
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    相关资源
    最近更新 更多