在Python中递归返回由列表表示的树的节点
我必须创建一个列表,其中包含按升序排列的二叉树的编号。但是我有一些困难要做。而且,我必须使用递归 下面是我的二进制数据树的一个示例:在Python中递归返回由列表表示的树的节点,python,recursion,tree,Python,Recursion,Tree,我必须创建一个列表,其中包含按升序排列的二叉树的编号。但是我有一些困难要做。而且,我必须使用递归 下面是我的二进制数据树的一个示例: t1 = [[[None,4,None],5,[None,5,None]],6,[None,7,[None,8,None]]] 我的函数返回: [2, 5, 5, 6, 7, 8] 我当时所做的: def recursive_course(t): """ Return list which contain the nu
t1 = [[[None,4,None],5,[None,5,None]],6,[None,7,[None,8,None]]]
我的函数返回:
[2, 5, 5, 6, 7, 8]
我当时所做的:
def recursive_course(t):
""" Return list which contain the numbers of t in order from a binary tree - recursive"""
liste=[]
for i in t:
if isinstance(i,int):
liste.append(i)
if isinstance(i,list):
for j in i:
if isinstance(j,int):
liste.append(j)
if isinstance(j,list):
for h in j:
if isinstance(h,int):
liste.append(h)
if t != None:
liste.append(t[1])
return liste
它是有效的,但不是完全有效
我会解释我的意思:在我的示例中,我的函数可以工作,但问题是,当我添加子树时,我的函数不能工作,因为我需要的树的数量与“for”循环的数量一样多。这就是为什么我必须使用递归方法,但我不知道如何使用上面的代码来实现这一点。递归是一种函数遗产,因此将其与函数风格结合使用会产生最好的结果。由于二叉树可以嵌套到任何深度,因此对于循环,不能依赖固定数量的嵌套
。然而,这并没有问题,因为函数式使用递归来循环,而不是对
语句使用
让我们先为我们的二叉树模块编写一些基本函数,btree
。定义像是空的
,左
,右
,和值
这样的函数可以让我们很容易地了解有关树的简单信息,并使用有意义的标识符来处理它们-
#btree.py
def为空(t):
不返回t
def左(t):
如果为空(t):
raise RUNTIMERROR(“无法访问空树的左侧”)
其他:
返回t[0]
def右(t):
如果为空(t):
raise RUNTIMERROR(“无法访问空树的权限”)
其他:
返回t[2]
def值(t):
如果为空(t):
raise RUNTIMERROR(“无法访问空树的值”)
其他:
返回t[1]
现在我们要定义inorder
,它将按顺序遍历树的节点。首先访问左侧
(最小)节点,然后访问右侧
(最大)节点-
我们现在可以使用新的二叉树编写main
程序了-
#main.py
从btree导入顺序
t1=[[None,4,None],5[None,5,None]],6[None,7[None,8,None]]
打印(列表(顺序(t1)))
[4,5,5,6,7,8]
给定该输入,您的函数应该返回什么?你得到的输出包括2
,它不在你原来的列表中,这让人很困惑。这可能是你的同学吗?非常相似(可能重复)的问题:嗯,我不知道,但可能,这可能是我们项目的最后一个问题谢谢你的回答,我没有看到!!你能给我解释一下你的最后一个函数def inoder(t)吗?我从不使用“收益率”,我总是使用列表。是否可以转换列表中的收益率?当然,如果为空(t):返回[]
和否则:返回顺序(左(t))+[value(t)]+顺序(右(t))
。您还可以使用else:return[*inorder(left(t)),value(t),*inorder(right(t))]
执行相同的操作。然后在最后的打印中,您可以将print(list(inoorder(t1))
更改为print(inoorder(t1))
。
# btree.py (continued)
def inorder (t):
if is_empty(t):
return
else:
yield from inorder(left(t)) # recursion
yield value(t)
yield from inorder(right(t)) # recursion