作为一项作业,我必须在python中编写一棵二叉树代码,在该树上可以执行简单的操作,然后以反波兰语表示法打印该表达式。我最初的回答基本上是正确的,最后,最后一个函数post_fix()
给了我错误'NoneType' object has no attribute 'left'
。这是我最初的答案:
class N:
"un noeud de l'arbre"
def __init__(self, c, l=None, r=None):
self.content = c
self.left = l
self.right = r
def print_tree(self):
if self.left is not None:
self.left.print_tree()
print(self.content)
if self.right is not None:
self.right.print_tree()
expression_1 = N('*', N('+', N(7), N(3)), N(4))
expression_2 = N('+', N(7), N('*', N(3), N(4)))
def isnumber(s):
try:
float(s)
return True
except ValueError:
return False
def calcule(x, oper, y):
"applique l'operateur à x et y et retourne le résultat"
if isnumber(x) and isnumber(y):
if oper == '+':
return x + y
elif oper == '-':
return x - y
if oper == '*':
return x * y
elif oper == '/':
return x / y
else:
print('\033[1;31mERROR: "{}" is not a valid operator.\033[1;m'.format(oper))
return None
else:
print ('\033[1;31mERROR: operands must be numerical values.\033[1;m')
def evalue(arbre):
"evalue l'expression logée dans l'arbre"
if type(arbre.content) in (float, int):
return arbre.content
else:
operator = arbre.content
vg = evalue(arbre.left)
vd = evalue(arbre.right)
return calcule(vg, operator, vd)
def post_fix(arbre):
"retourne l'expression de cet arbre en notation post-fixée"
pf = ''
if arbre.left is not None :
pf = pf + post_fix(arbre.left) + ' '
if arbre.right is not None :
pf = pf + post_fix(arbre.right) + ' '
return pf + arbre.content
print('Expression 1 en notation post-fix:', post_fix(expression_1))
print('Expression 2 en notation post-fix:', post_fix(expression_2))
给出了定义post_fix()
的正确方法:
def post_fix(arbre):
"retourne l'expression de cet arbre en notation post-fixée"
pf = str()
if arbre.left is not None :
pf = pf + post_fix(arbre.left) + ' '
if arbre.right is not None :
pf = pf + post_fix(arbre.right) + ' '
return pf + str(arbre.content)
有人可以告诉我两者之间的区别,以及我的原始声明导致错误的原因吗?预先谢谢你。
编辑:
我注意到,在接受了答案之后,主要的问题是类型不兼容,但是问题仍然悬而未决:给出的错误是'NoneType' object has no attribute 'left'
。我在用Jupyter。
答案 0 :(得分:0)
运行代码时,我实际上收到如下错误
return pf + arbre.content
TypeError: can only concatenate str (not "int") to str
这告诉您不能将int
和str
串联在一起,因此第一种方法不起作用,但是可以将int
转换为{{ 1}},这是我们在第二种方法中所做的
str
如您所见,将字符串和整数连接在一起会引发错误,但是在将字符串转换为整数然后进行连接时并没有引发此类错误,这是在In [16]: x = 'a'
In [17]: y = 2
In [18]: x+y
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-18-259706549f3d> in <module>
----> 1 x+y
TypeError: can only concatenate str (not "int") to str
In [19]: x+str(y)
Out[19]: 'a2'
的第一种和第二种方式中发生的情况分别