在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