树蟒的深度

use*_*075 9 python oop methods tree

我是编程的新手,我正在尝试计算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
Run Code Online (Sandbox Code Playgroud)

Sna*_*fee 9

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

    return max(depth(self.left), depth(self.right)) + 1
Run Code Online (Sandbox Code Playgroud)

应该

def depth(self):
    return max(self.left.depth() if self.left else 0, self.right.depth() if self.right else 0) + 1
Run Code Online (Sandbox Code Playgroud)

更易读的版本:

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
Run Code Online (Sandbox Code Playgroud)

问题是没有任何功能depth.它是Node对象的一种方法,因此您需要从对象本身(左侧和右侧)调用它.我缩短了代码,self.left.depth() if self.left else 0self.right.depth() if self.right else 0以删除您以前的检查(他们现在隐含的),因为我相信这是完全可能的,左边是None,而右边是一个Node或反之亦然,这将导致原始代码抛出的AttributeError,因为None没有一个方法depth.

编辑

在回答有关该<something> if <some condition> else <otherwise>块的问题时:

该行给出<something>if <some condition>是true-y(视为true),<otherwise>if <some condition>是false-y(视为false)