我必须定义三个函数:postorder(t):
,inorder(t):
和flat_list()
。
每个函数都将二叉树作为输入并返回一个列表。然后应该以相同的方式对列表进行排序,在相应的遍历(后序,预订或有序)中访问树元素
我已经为每个人编写了一个代码,但是当我调用另一个函数(if not x or len(x) < 1 or n > len(x) or x[n] == None:
IndexError: list index out of range
)时,我一直收到错误,我得到了一个索引错误
def postorder(t):
pass
if t != None:
postorder(t.get_left())
postorder(t.get_right())
print(t.get_data())
def pre_order(t):
if t != None:
print(t.get_data())
pre_order(t.get_left())
pre_order(t.get_right())
def in_order(t):
pass
if t != None:
in_order(t.get_left())
print(t.get_data())
in_order(t.get_right())
def flat_list2(x,n):
if not x or len(x) < 1 or n > len(x) or x[n] == None:
return None
bt = BinaryTree( x[n] )
bt.set_left( flat_list2(x, 2*n))
bt.set_right(flat_list2(x, 2*n + 1))
return bt
我的遍历方法的代码如下:
flat_node_list = [None, 55, 24, 72, 8, 51, None, 78, None, None, 25]
bst = create_tree_from_flat_list2(flat_node_list,1)
pre_order_nodes = pre_order(bst)
in_order_nodes = in_order(bst)
post_order_nodes = post_order(bst)
print( pre_order_nodes)
print( in_order_nodes)
print( post_order_nodes)
这就是我如何调用flat_list2
sudo watch tail /var/log/apache2/error.log
答案 0 :(得分:1)
实际上你应该编写三个返回迭代器的函数。让呼叫者决定是否需要列表。使用发电机功能最容易做到这一点。在3.4+中,'yield from`可以用来代替for循环。
def in_order(t):
if t != None:
yield from in_order(t.get_left())
yield t.get_data()
yield from in_order(t.get_right())
移动其他两个版本的yield语句。
答案 1 :(得分:0)
首先,我注意到您的缩进在您提供的代码块中不一致(在修订版中已修复)。 严重确保您的缩进在Python
中保持一致,否则将很快向南移动。此外,在下面的代码中,我假设您希望t.get_data()
仍然属于if t != None
中的postorder(t)
,所以我在下面缩进。最后,我注意到您的方法名称与您在问题中列出的规范不匹配,因此我更新了以下方法名称以符合您的规范(命名中没有_
)。
要获取列表,您需要做的就是让遍历方法返回一个列表,然后在遍历的每个级别使用其他遍历值extend
列表。这样做不是打印数据。
def postorder(t):
lst = []
if t != None:
lst.extend(postorder(t.get_left()))
lst.extend(postorder(t.get_right()))
lst.append(t.get_data())
return lst
def preorder(t):
lst = []
if t != None:
lst.append(t.get_data())
lst.extend(preorder(t.get_left()))
lst.extend(preorder(t.get_right()))
return lst
def inorder(t):
lst = []
if t != None:
lst.extend(inorder(t.get_left()))
lst.append(t.get_data())
lst.extend(inorder(t.get_right()))
return lst
这将遍历每个节点上的左右两侧的完整深度,并且取决于它是preorder
,postorder
还是inorder
,将附加所有遍历的元素。命令它们被遍历。一旦发生这种情况,它会将正确排序的列表返回到下一级别,以便附加到其列表中。这将递归,直到你回到根级别。
现在,来自IndexError
的{{1}}可能是由于flat_list
可能等于x[n]
时尝试访问n
而导致的。请记住,len(x)
中的列表/数组是从Python
编制索引的,这意味着列表的最后一个元素是0
,而不是x[n-1]
。
因此,要解决此问题,请将x[n]
替换为x[n]
。像这样:
x[n-1]