【发布时间】:2017-07-01 08:33:24
【问题描述】:
我正在尝试从平面列表创建一棵树。我需要定义一个名为tree_from_flat_list 的函数。对于索引位置i的任何节点,左孩子存储在索引位置2*i,右孩子存储在索引位置2*i+1。 :
class BinaryTree:
def __init__(self, data):
self.data = data
self.left = None
self.right = None
def get_left(self):
return self.left
def get_right(self):
return self.right
def set_left(self, tree):
self.left = tree
def set_right(self, tree):
self.right = tree
def set_data(self, data):
self.data = data
def get_data(self):
return self.data
def create_string(self, spaces):
info = ' ' * spaces + str(self.data)
if self.left != None:
info += '\n(l)' + self.left.create_string(spaces+4)
if not self.right == None:
info += '\n(r)' + self.right.create_string(spaces+4)
return info
def __str__(self):
representation = self.create_string(0)
return representation
def tree_from_flat_list(node_list):
if node_list != None:
root_index = 1
list1 = []
list2 = []
root = node_list[root_index]
left_sub_tree = list1.append(node_list[2*root_index])
right_sub_tree = list2.append(node_list[2*root_index+1])
tree = BinaryTree(root)
tree.set_left(tree_from_flat_list(left_sub_tree))
tree.set_right(tree_from_flat_list(right_sub_tree))
return tree
当我尝试运行这个时:
def test():
flat_list = [None, 10, 5, 15, None, None, 11, 22]
my_tree = tree_from_flat_list(flat_list)
print(my_tree)
test()
我应该得到输出:
10
(l) 5
(r) 15
(l) 11
(r) 22
编辑:仍然坚持我应该为该功能做什么。任何帮助仍然很感激。
中间的空格数是树的高度,l 和 r 表示它们是左孩子还是右孩子。这看起来像:
10
/ \
5 15
/ \
11 22
但我只得到:
10
我应该如何编辑我的tree_from_flat_list 函数以使其正常工作。任何帮助表示赞赏。谢谢。
【问题讨论】:
-
你能添加一些关于如何从列表中构造树的信息(以文本格式)吗?
-
你能解释一下你的打印输出到底代表什么吗?应该从
[None, 10, 5, 15, None, None, 11, 22]生成的二叉树的结构究竟是什么?我可以开始做假设,但如果你从一开始就指定这一点会更好。 -
另外,不要使用 getter 和 setter,这是 Python,而不是 Java。
-
所以,根据您的规范,列表将始终以
None? 开头 -
@EllenPage 那么左孩子的节点会去哪里寻找索引为 0 的节点呢?
标签: python recursion binary-tree