问题描述
我有一个叫做 ExpressionTree 的类,它是一个 N 元表达式树,这样每个节点不仅限于只有两个子节点;可以多于 2 个,但不能少于 2 个。
我在这棵树中使用的唯一运算符是“+”和“-”(但代码应该适用于任何运算符)。
所有叶子要么是单个字母字符串,要么是一个整数,并且所有父母都是“+”或“-”。
我尝试创建的方法名为create_tree,它接收一个名为lst 的列表,其类型为:List[List[Union[int,str]]],并返回一个成功创建的ExpressionTree来自参数:lst。
lst 中的每个列表代表一个级别,但是对于列表中的每个运算符,下一个列表是每个运算符的子级。例如,如果 lst = [[+],[+,+],[1,2],[3,4]]
,那么树应该看起来像:
在一个更嵌套的例子中,如果我要运行 create_class([[+],+,[5,*],[b,c],[6,a]])
,我应该得到的树是:
我知道队列会非常有用,但我不知道从哪里开始。 我认为这段代码不一定需要递归,但如果正确实现,它也可以使用它。 非常感谢您对代码的任何帮助。 提前致谢!
解决方法
您可以递归地对列表进行分区以构建树:
from collections import deque
def to_tree(d):
k = [[i,[] if i not in {'+','*'} else d.popleft()] for i in d.popleft()]
for i in range(len(k)):
if k[i][0] in {'+','*'}:
d = deque([k[i][-1],*d])
k[i][-1] = k[i][-1] if len(d) == 1 else to_tree(d)
return [[a,b] if b else a for a,b in k]
lst = [['+'],['+','+'],['1','2'],['3','4']]
lst1 = [['+'],'+',['5','*'],['b','c'],['6','a']]
lst2 = [['+'],'c','a']]
print(to_tree(deque(lst)))
print(to_tree(deque(lst1)))
print(to_tree(deque(lst2)))
输出:
[['+',[['+','2']],'4']]]]]
[['+',['*','a']]]],'c']]]]]
[['+','a']]]]]