2017-08-12 2 views
1

Ich versuche, die Knoten in einem binären Baum zusammenzufassen:Summierungsknotenpunkten in binären Baum (Python) - Typeerror: ‚NoneType‘

def average(tree): 
    if tree is None: 
     return 
    total = (tree['data']) + (average(tree['left'])) + (average(tree['right'])) 
    print(total) 

ich auch versucht, „ist“ und „ist nicht“ jedoch es gab mir noch die folgenden Fehler:

TypeError: unsupported operand type(s) for +: 'int' and 'NoneType' 
+1

Das leere 'return' gibt' None' zurück, so dass Ihr Check im Grunde nutzlos ist. Vielleicht geben Sie einen Standardwert _integer_ zurück, z. B. "0". Außerdem sollte es 'wenn Baum keine ist:' mit 'ist' und nicht mit' == '. –

+3

Sie müssen auch 'total zurückgeben'. Außerdem empfehlen wir Ihnen, 'sum' nicht als Funktionsnamen zu verwenden, es verbirgt Pythons eingebaute' summe'. – AChampion

+0

@Christian Dean warum nicht '==' oder gar 'nicht'? –

Antwort

0

es gibt zwei Probleme hier, die mit der Betreuung zu tun haben Werte zurückzukehren, sobald sie von average berechnet wurden.

Zuerst wird in Ihrem Code die einzige return Anweisung den nicht numerischen None Wert zurückgeben. Dies ist ein Problem, wenn Sie einen Knoten ohne zwei untergeordnete Knoten (z. B. ein Blatt) erhalten, tree['left'] oder/und tree['right'] wird None zurückgegeben. Diese None wird an average übergeben, die None zurückgibt. Der Fehler, den Sie erhalten, ist darauf zurückzuführen, dass Sie versuchen, diesen zurückgegebenen Wert in der dritten Zeile der Funktion hinzuzufügen. Um dies zu beheben, können Sie einfach einen "Basisfall" -Wert für den "Mittelwert" eines leeren Baums zurückgeben.

Zweitens, selbst in dem Fall, in den average rekursiv auf einem untergeordneten Knoten aufgerufen wird, die nicht None ist, average wird noch Rückkehr None denn da es keine andere Anweisung return in der Funktion und in Python, wenn Auswertung erreicht die Ende einer Funktion ohne eine return-Anweisung gibt es eine implizite Rückgabe von None. Um dies zu beheben, geben Sie einfach die total zurück, die Sie berechnet haben!

Fixing diese beiden Probleme wie folgt aussehen könnte:

def average(tree): 
    if tree is None: 
     return 0 
    total = tree['data'] + average(tree['left']) + average(tree['right']) 
    return total 

obwohl ich nicht mit Sicherheit sagen kann, dass die Null in dem Basisfall Rückkehr ist das Beste für genau das, was Sie versuchen zu erreichen.

Als letzte Anmerkung möchten Sie vielleicht eine Überprüfung hinzufügen, dass tree['data'] nicht None ist, um Kantenfälle auszuschließen, bei denen Knoten keine Daten haben!

+0

Vielen Dank! – Andy

Verwandte Themen