树蟒的深度

时间:2013-03-05 02:35:36

标签: 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

4 个答案:

答案 0 :(得分:8)

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 0self.right.depth() if self.right else 0,以便删除您之前的检查(它们现在是隐含的),因为我认为完全有可能左边是None而{ right是Node,反之亦然,这会导致原始代码抛出AttributeError,因为None没有方法depth

修改

回答有关<something> if <some condition> else <otherwise>阻止的问题:

如果<something>为true-y(视为true),则该行提供<some condition>;如果<otherwise>为false-y(视为false),则该行提供<some condition>

答案 1 :(得分:2)

为清楚起见,我建议您按照以下方式编写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

答案 2 :(得分:1)

错误来自这一行:

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

您正在使用深度作为函数并尝试将其应用于左右节点。因为左节点和右节点也是节点,所以它们具有深度方法。

您应该像这样调用深度方法:

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

self参数隐式传递给depth方法,但是使用dot运算符会告诉Python这个方法属于一个Node实例,并且它不是一个没有绑定到对象的其他函数。

答案 3 :(得分:0)

您需要考虑四个案例:

  1. 两个子树都是空的。
  2. 左边的子树是空的。
  3. 单独的右子树是空的。
  4. 子树都不是空的。
  5. 您已经涵盖了案例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