我一直在阅读这本书here,我正在尝试完成上一次要求您构建二叉树的练习。然而,我很难理解如何添加树项目。
这是BinaryTree类:
class BinaryTree(object):
def __init__(self, rootObj):
self.key = rootObj
self.leftChild = None
self.rightChild = None
def insertLeft(self, newNode):
if self.leftChild == None:
self.leftChild = BinaryTree(newNode)
else:
t = BinaryTree(newNode)
t.leftChild = self.leftChild
self.leftChild = t
def insertRight(self, newNode):
if self.rightChild == None:
self.leftChild = BinaryTree(newNode)
else:
t = BinaryTree(newNode) # make a new BinaryTree first
t.rightChild = self.rightChild
self.rightChild = t
def getRightChild(self):
return self.rightChild
def getLeftChild(self):
return self.leftChild
def setRootVal(self, obj):
self.key = obj
def getRootVal(self):
return self.key
当我尝试向树中添加项目时,它们并没有真正按照我的预期进行。
例如,如果我执行以下代码:
a = BinaryTree('a')
a.insertLeft('b')
a.getLeftChild().insertRight('c')
a.insertRight('w')
a.getRightChild().insertRight('x') #this one raises an error
最后一行导致AttributeError: 'NoneType' object has no attribute 'insertRight'
为什么这一行会导致此错误?为什么第3行不会引发错误?
答案 0 :(得分:1)
您的insertRight
方法会在左侧:
def insertRight(self, newNode):
if self.rightChild == None:
self.leftChild = BinaryTree(newNode)
# ^^^^
因此,您的所有rightChild
属性将永久保留None
。
您应该使用is
来测试None
:
def insertRight(self, newNode):
if self.rightChild is None:
self.rightChild = BinaryTree(newNode)
else:
t = BinaryTree(newNode) # make a new BinaryTree first
t.rightChild = self.rightChild
self.rightChild = t