2017-08-12 54 views
1

我想二叉树总结节点:求和节点 - 类型错误:“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' 
+1

裸'返回'返回'无',所以你的支票基本上是无用的。也许返回一个默认的_integer_值,比如“0”。另外,它应该是'如果树是None:'用'is'而不是'=='。 –

+3

你还需要'返回total'。另外,建议你不要使用'sum'作为你的函数名,它隐藏了python的内置'sum'。 – AChampion

+0

@Christian Dean为什么不是'=='甚至是'不是'? –

回答

0

这里有两个问题,其中有照顾,一旦他们已经从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

相关问题