用非静态方法遍历二叉树?

时间:2018-07-12 06:40:11

标签: python binary-tree

我正在编写一个如下所示的BinTree类:

class Tree:
    def __init__(self, key, left=None, right=None):
        self.key = key
        self.left = left
        self.right = right

    @staticmethod
    def traversal(t):
        if t is None:
            #  Do something
            pass
        else:
            #  Preorder
            Tree.traversal(t.left)
            #  Inorder
            Tree.traversal(t.right)
            #  Postorder

我很好奇使用非静态方法执行此操作。我试图这样做似乎无效:

def traversal(self):
    if self is None:
        #  Do something
        pass
    else:
        #  Preorder
        self.left.traversal()
        #  Inorder
        self.left.traversal()
        #  Postorder

是因为self不能成为None吗?

无论如何,我想知道使用递归或迭代的非静态方法进行BinTree遍历(甚至其他方法,例如插入等)是可能的吗?

1 个答案:

答案 0 :(得分:4)

是的,在正常方法调用中self不能为None 1 如果为None,则尝试执行时会出错在其上调用该方法。 2

但这只是意味着您必须进行一些重组:您不必无条件地在子树上调用traversal,而是指望如果它们是None则不会安全地执行任何操作首先检查他们是否None,以便您跳过通话。

由于Tree实例始终是真实的(因为您没有在类型上定义__bool____len__来覆盖该默认值),因此您可以通过以下方式进行检查:

if self.left:

所以:

def traversal(self):
    #  Preorder
    if self.left: self.left.traversal()
    #  Inorder
    if self.right: self.right.traversal()
    #  Postorder

您可以类似地将每个树方法转变为普通方法,但类似地,您必须对其中的一些方法进行小的更改。


1。好吧,除了NoneType上定义的方法。显然,当您在print(None)方法中NoneType.__str__时,selfNone

2。好吧,这不是真的。如果您在self.left.traversal()self.left的情况下尝试调用None,则说明您正在呼叫NoneType.traversal,并且没有这样的方法,因此就是AttributeError。但是,另一方面,如果您尝试调用Tree.traversal(self.left),则尝试使用Tree来调用未绑定的None方法,这是一个TypeError,但这是一个不需要检查Python 3.x(与2.x不同)的实现。到目前为止,还没有任何版本的CPython或PyPy 3.x进行过检查,而且它们可能永远不会。因此,如果您这样编写,它实际上将有效。但这显然不是您应该依靠的东西。