14

私はプログラミングが初めてで、 Python で二分木の深さを計算しようとしています。私のエラーは、深さが Node クラスのメソッドであり、通常の関数ではないためだと思います。私はOOPを学ぼうとしていて、メソッドを使いたいと思っていました. これは初心者のエラーかもしれません...これが私のコードです:

class Node:

    def __init__(self, item, left=None, right=None):
        """(Node, object, Node, Node) -> NoneType
        Initialize this node to store item and have children left and right.
        """
        self.item = item
        self.left = left
        self.right = right

    def depth(self):
        if self.left == None and self.right == None:
            return 1

        return max(depth(self.left), depth(self.right)) + 1

i receive this error:

>>>b = Node(100)

>>>b.depth()

1 

>>>a = Node(1, Node(2), Node(3))

>>>a.depth()

Traceback (most recent call last):
  File "C:\Program Files\Wing IDE 101 4.1\src\debug\tserver\_sandbox.py", line 1, in <module>
    # Used internally for debug sandbox under external interpreter
  File "C:\Program Files\Wing IDE 101 4.1\src\debug\tserver\_sandbox.py", line 15, in depth
builtins.NameError: global name 'depth' is not defined
4

4 に答える 4

13
def depth(self):
    if self.left == None and self.right == None:
        return 1

    return max(depth(self.left), depth(self.right)) + 1

する必要があります

def depth(self):
    return max(self.left.depth() if self.left else 0, self.right.depth() if self.right else 0) + 1

より読みやすいバージョン:

def depth(self):
    left_depth = self.left.depth() if self.left else 0
    right_depth = self.right.depth() if self.right else 0
    return max(left_depth, right_depth) + 1

問題は、機能がないことdepthです。これはオブジェクトのメソッドNodeなので、オブジェクト自体 (左と右) から呼び出す必要があります。self.left.depth() if self.left else 0以前のチェックを削除するために、コードを短縮しましたself.right.depth() if self.right else 0(現在は暗黙的です)。左が a であるNone一方で右が a である、Nodeまたはその逆である可能性が完全にあると考えているため、元のコードがスローされますAttributeErrorsinceにはメソッドがありNoneませんdepth

編集

<something> if <some condition> else <otherwise>ブロックに関する質問への回答:

この行は<something>、if <some condition>is true-y (true として扱われる) と<otherwise>if <some condition>is false-y (false として扱われる) を示します。

于 2013-03-05T02:38:08.993 に答える
4

わかりやすくするために、次のdepthようにメソッドを作成することをお勧めします。

def depth(self):
    current_depth = 0

    if self.left:
        current_depth = max(current_depth, self.left.depth())

    if self.right:
        current_depth = max(current_depth, self.right.depth())

    return current_depth + 1
于 2013-03-05T02:41:28.943 に答える
1

考慮すべき 4 つのケースがあります。

  1. サブツリーは両方とも空です。
  2. 左のサブツリーだけは空です。
  3. 右側のサブツリーだけは空です。
  4. どちらのサブツリーも空ではありません。

ケース 1 と 4 をカバーしましたが、2 と 3 を見逃しました。修正:

# Return height of tree rooted at this node.
def depth(self):
    if self.left == None and self.right == None:
        return 1
    elif self.left == None:
        return self.right.depth() + 1
    elif self.right == None:
        return self.left.depth() + 1
    else:
        return max(self.left.depth(), self.right.depth()) + 1
于 2013-03-05T20:42:31.407 に答える
1

エラーは次の行から発生しています。

return max(depth(self.left), depth(self.right)) + 1

深さを関数として使用し、それを左右のノードに適用しようとしています。左右のノードもノードなので、深さの方法があります。

次のように深さメソッドを呼び出す必要があります。

return max(self.left.depth(), self.right.depth()) + 1

self パラメーターは暗黙的に depth メソッドに渡されますが、それをドット演算子と共に使用すると、このメソッドが Node インスタンスに属し、オブジェクトにバインドされていない他の関数ではないことが Python に通知されます。

于 2013-03-05T20:15:12.297 に答える