2017-08-12 11 views
1

私は、バイナリツリー内のノードを総括しようとしています:サミングノード - 例外TypeError:「NoneType」

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

私はまた、しかし、「ある」と「ない」で試してみました彼らはaverageから計算された後の値を返すように注意しながら、としなければならない、ここで2つの問題があります。

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

裸の 'return'は' None'を返すので、あなたのチェックは基本的に無駄です。おそらく '0'のようなデフォルトの_integer_値を返します。また、 '=='ではなく 'is'で '' tree is None: ''にする必要があります。 –

+3

また、 'return tot'も必要です。また、関数名として 'sum'を使用しないことをお勧めします。これはPythonの組み込み' sum'を隠します。 – AChampion

+0

@Christian Deanなぜ '=='や 'not'ですか? –

答えて

0

:それはまだ私に次のエラーが発生しました。

まず、あなたのコードでは、唯一のreturnステートメントは数値以外のNone値を返します。これは、2つの子ノード(リーフなど)を持たないノードがある場合、tree['left']またはtree['right']Noneを返すような問題です。このNoneaverageに渡され、Noneを返します。取得したエラーは、関数の3行目にこの返された値を続けて追加しようとしているためです。これを修正するには、空のツリーの「平均」をどうするべきかのための「基本ケース」値を単純に戻すことができます。

第二に、でもaverageNoneない子ノードに再帰的に呼び出された場合、中averageますまだリターンNone機能には他のreturn文がないよう、およびPythonで評価が到達したときので、 return文がない関数の最後には、Noneという暗黙の戻り値があります。これを修正するには、計算したtotalを返すだけです!この2つの問題を修正

は次のようになります。

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

関連する問題