2

ソートされた配列から BST を作成する上記の単純なプログラムがあります。基本的に None である葉を表示せずにツリーを解析する必要があります。プログラムがまだ「なし」を吐き出す理由を誰かが説明してくれませんか。私は != 'None' と is None を試しましたが、同じ結果が得られました。

class Node:
    def __init__(self,value):
        self.value=value
        self.nodeleft=None
        self.noderight=None

def makeBST(ia,start,end,tree):
    if (end < start):
        return None
    mid = (start + end) / 2
    n = Node(ia[mid])
    n.nodeleft = makeBST(ia, start, mid-1, tree)
    n.noderight = makeBST(ia, mid+1, end, tree)
    tree.append(n)
    return n

def printBST(root):
    print 'RR' ,root.value
    if root.nodeleft == None:
        print 'EOT'
    else:    
        print printBST(root.nodeleft)

    if root.noderight == None:
        print 'EOT'
    else:    
        print printBST(root.noderight)

if __name__ == '__main__':
    array = [1, 2, 3, 4, 5, 6]
    dic = []
    root = makeBST(array, 0, len(array)-1, dic)
    printBST(root)
4

2 に答える 2

4

問題は、コードが の戻り値を渡していたことprintBSTですprintprintBST何も返さないので、None印刷しました。

だからあなたが書いたとき:

print printBST(root.nodeleft)

return ステートメントが含まれておらず、デフォルトで return に設定されているNoneため、そのコードは確実に出力されます。printBSTNone

printBSTこれを行うには、次のように変更する必要があります。

def printBST(root):
    print 'RR' ,root.value
    if root.nodeleft is None:
        print 'EOT'
    else:    
        printBST(root.nodeleft)

    if root.noderight is None:
        print 'EOT'
    else:    
        printBST(root.noderight)

isusingが をテストする正しい方法であることにも注意してくださいNone

とはいえ、次のようにコードを単純化できます。

def printBST(root):
    if root is None:
        print 'EOT'
        return
    print 'RR', root.value
    printBST(root.nodeleft)
    printBST(root.noderight)

このコードは単純であるだけでなく、空のツリーが表示されても失敗しないという追加の利点があります。

于 2013-10-06T13:34:21.530 に答える
2

printBSTreturnそれらではなく、値を指定する必要がありprintます。何も返さないため、デフォルトはNoneです。それが理由ですprintBST(root) is None

printBST(root)それ自体では値を出力しません。前に置く必要がありますprint

print printBST(root)

PEP 8に従って、 NoneTypeシングルトンを等値演算子 (==および など)と決して比較しないでください!=is Noneおよび/またはを使用is not None

于 2013-10-06T13:30:45.767 に答える