我正在编写一个如下所示的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遍历(甚至其他方法,例如插入等)是可能的吗?
答案 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__
时,self
是None
…
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进行过检查,而且它们可能永远不会。因此,如果您这样编写,它实际上将有效。但这显然不是您应该依靠的东西。