如何将平面列表转换为二叉树

时间:2017-02-02 23:34:58

标签: python python-3.x tree

我们说我有一个这样的清单:

flat_list = [None, 10, 5, 15, None, None, 11, 22] 

我知道从嵌套列表创建树的算法如下:

def create_tree_from_nested_list(node_list):
    if not node_list:
        return node_list
    d, l, r = node_list
    tree = BinaryTree(d)
    tree.set_left(create_tree_from_nested_list(l))
    tree.set_right(create_tree_from_nested_list(r))
    return tree

上面代码的输出是:

10
(l)    5
(r)    15
(l)        11
(r)        22

我如何创建一个函数来将列表平面化为树,以便左边的列表存储在索引位置2*i,右边的列表存储在索引位置2 * i + 1,输出是与嵌套列表的输出相同。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

您可以修改嵌套列表代码以在平面列表上工作。由于分割子树列表不是一种简单的方法,我建议将要构建的节点的索引作为参数传递,以及整个平面列表。索引的默认值为1(因此您不需要将其传递给根节点):

def create_tree_from_flat_list(node_list, index=1):
    if index >= len(node_list) or node_list[index] is None:
        return None
    d = node_list[index]
    l = index * 2
    r = l + 1
    tree = BinaryTree(d)
    tree.set_left(create_tree_from_flat_list(node_list, l))
    tree.set_right(create_tree_from_flat_list(node_list, r))
    return tree

在此功能中使用单独的dlr变量并不是必不可少的(它们可以在它们被使用的地方进行计算)。我这样做是为了使函数更明显地与嵌套列表版本并行。 lr是左右子树根的索引。

示例输出:

> print(create_tree_from_flat_list([None, 10, 5, 15, None, None, 11, 22]))
10
(l)    5
(r)    15
(l)        11
(r)        22