2017-08-12 58 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

相關問題