我们说我有一个这样的清单:
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
,输出是与嵌套列表的输出相同。任何帮助表示赞赏。
答案 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
在此功能中使用单独的d
,l
和r
变量并不是必不可少的(它们可以在它们被使用的地方进行计算)。我这样做是为了使函数更明显地与嵌套列表版本并行。 l
和r
是左右子树根的索引。
示例输出:
> print(create_tree_from_flat_list([None, 10, 5, 15, None, None, 11, 22]))
10
(l) 5
(r) 15
(l) 11
(r) 22