求和节点 - 类型错误:“NoneType”
问题描述:
我想二叉树总结节点:求和节点 - 类型错误:“NoneType”
def average(tree):
if tree is None:
return
total = (tree['data']) + (average(tree['left'])) + (average(tree['right']))
print(total)
我也试图与“是”和“不是”,然而它仍然给了我下面的错误:
TypeError: unsupported operand type(s) for +: 'int' and 'NoneType'
答
这里有两个问题,其中有照顾,一旦他们已经从average
计算返回值做。
首先,在您的代码中,唯一的return
语句将返回非数字None
值。这是一个问题,因为当你得到没有两个子节点的节点时(例如一个叶节点),tree['left']
或/和tree['right']
将返回None
。此None
传递给average
,返回None
。你得到的错误是由于后续尝试在函数的第三行添加这个返回的值。为了解决这个问题,你可以简单地返回一个“基本情况”值,以表示空的树的“平均值”应该是多少。
其次,即使在average
递归调用不是None
子节点上的情况下,average
将仍然返回None
因为没有在功能上没有其他return语句,并在Python当评估到达没有返回语句的函数的结尾有一个隐含的返回None
。要解决这个问题,只需返回你计算的total
!
修复这两个问题看起来可能像下面这样:
def average(tree):
if tree is None:
return 0
total = tree['data'] + average(tree['left']) + average(tree['right'])
return total
虽然我不能肯定地说,在基本情况下返回零是最适合正是你所要完成的任务。
作为最后一点,您可能希望添加tree['data']
不是None
的检查来排除节点没有数据的边缘情况!
+0
非常感谢! – Andy
裸'返回'返回'无',所以你的支票基本上是无用的。也许返回一个默认的_integer_值,比如“0”。另外,它应该是'如果树是None:'用'is'而不是'=='。 –
你还需要'返回total'。另外,建议你不要使用'sum'作为你的函数名,它隐藏了python的内置'sum'。 – AChampion
@Christian Dean为什么不是'=='甚至是'不是'? –