微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从列表定义创建 N 元表达式树

如何解决从列表定义创建 N 元表达式树

这里是代码新手,我正在用 Python 创建一个项目。

我有一个叫做 ExpressionTree 的类,它是一个 N 元表达式树,这样每个节点不仅限于只有两个子节点;可以多于 2 个,但不能少于 2 个。

类的私有变量是:_rootOptional[Union[str,int]]_subtreesList[ExpressionTree]。我已经成功实现了 __eq__、is_empty、evaluate_tree、__str__ 和 append 等基本方法,但我一直坚持使用一种方法

在这棵树中使用的唯一运算符是“+”和“-”(但代码应该适用于任何运算符)。

所有叶子要么是单个字母字符串,要么是一个整数,并且所有父母都是“+”或“-”。此外,所有叶子都是 ExpressionTrees,但 self._subtrees 的列表为空。

我尝试创建的方法名为create_tree,它接收一个名为lst 的列表,其类型为:List[List[Union[int,str]]],并返回一个成功创建的ExpressionTree来自参数:lst。

lst 中的每个列表代表一个级别,但是对于列表中的每个运算符,下一个列表是每个运算符的子级。例如,如果 lst = [[+],[+,+],[1,2],[3,4]],那么树应该看起来像:

Tree 1

一个更嵌套的例子中,如果我要运行 create_tree([[+],+,[5,*],[b,c],[6,a]]),我应该得到的树是:

Tree 2

我知道队列会非常有用,但我不知道从哪里开始。 我认为这段代码不一定需要递归,但如果正确实现,它也可以使用它。

我不希望使用任何导入或创建新类,除了 List。

我的 doctest 是这样的:

>>> lst = [['*'],'*','*'],1],['b','c']]
>>> express_tree = create_tree(lst)
>>> print(express_tree) == (3 * (5 * 1) * (b * c))
True
>>> express_tree._root == '*'
True
>>> express_tree._subtrees == [ExpressionTree(3,[]),ExpressionTree('*',[ExpressionTree(5,ExpressionTree(1,[])]),[ExpressionTree('b',ExpressionTree('c',[])])]
True

在过去的 12 个小时里,我一直试图正确地实现这一点,但我没有运气,而且我认为我的大脑工作不正常。 非常感谢您对代码的任何帮助。 请帮助这个可怜的家伙,这样我就可以摆脱课堂的噩梦,从事更有趣的编码项目。 提前致谢!

解决方法

在递归函数中,可以通过将形成的层级传递给ExpressionTree来构建树:

class ExpressionTree:
   def __init__(self,_root,_subtrees):
      self._root,self._subtrees = _root,_subtrees
   def __repr__(self):
      return f'{self.__class__.__name__}({self._root},{self._subtrees})'

def to_tree(d):
   k = [ExpressionTree(i,[] if i not in {'+','*'} else d.pop(0)) for i in d.pop(0)]
   for i in range(len(k)):
      if k[i]._root in {'+','*','-'}: 
         d = [k[i]._subtrees,*d]
         if len(d) == 1:
            k[i]._subtrees = [ExpressionTree(i,[]) for i in k[i]._subtrees]
         else:
            k[i]._subtrees = to_tree(d)
   return k


lst = [['*'],[3,'*'],[5,1],['b','c']]
lst1 = [['+'],['+','+'],['1','2'],['3','4']]
lst2 = [['+'],'+',['5','c'],['6','a']]
lst3 = [['+'],'c','a']]
for i in [lst,lst1,lst2,lst3]:
   print(to_tree(i))
   print('-'*20)

输出:

[ExpressionTree(*,[ExpressionTree(3,[]),ExpressionTree(*,[ExpressionTree(5,ExpressionTree(1,[])]),[ExpressionTree(b,ExpressionTree(c,[])])])]
--------------------
[ExpressionTree(+,[ExpressionTree(+,[ExpressionTree(1,ExpressionTree(2,ExpressionTree(+,ExpressionTree(4,[ExpressionTree(6,ExpressionTree(a,[])])]),[])])])]
--------------------

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。