Binary Tree AttributeError: объект "NoneType" не имеет атрибута "insertRight"

Я читаю книгу здесь, и я пытаюсь завершить последнее упражнение, которое просит вас построить двоичное дерево. Тем не менее мне трудно понять, как добавляются элементы дерева.

Вот BinaryTree Class:

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' Почему эта строка вызывает эту ошибку? Почему третья строка не вызывает ошибку?

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

licensed under cc by-sa 3.0 with attribution.