Ошибка атрибута при бинарном дереве поиска?
Я пытаюсь написать программное обеспечение для печати BST, содержащего строки в предзаказе, и этот код у меня есть до сих пор. по какой-то причине он напечатает первые две строки, а затем сломается и выдаст мне ошибку "AttributeError: объект NoneType" не имеет атрибута "значение" "
class Node(object):
def __init__(self, value):
self.value = value
self.left = None
self.right = None
self.count = 1
def insert(root, value):
if not root:
return Node(value)
elif root.value == value:
root.count += 1
elif value < root.value:
root.left = insert(root.left, value)
else:
root.right = insert(root.right, value)
return root
def create(seq):
root = None
for word in seq:
root = insert(root, word)
return root
def preOrder(root):
print(root.value)
print("root.value printed")
if root.left != 0:
preOrder(root.left)
if root.right != 0:
preOrder(root.right)
src = ['foo', 'bar', 'foobar', 'barfoo', 'overflow', 'python']
tree = create(src)
print(preOrder(tree))
Это вывод, который он мне даст:
foo
root.value printed
bar
root.value printed
Traceback (most recent call last):
File "", line 37, in <module>
print(preOrder(tree))
File "", line 29, in preOrder
preOrder(root.left)
File "", line 29, in preOrder
preOrder(root.left)
File "", line 26, in preOrder
print(root.value)
AttributeError: 'NoneType' object has no attribute 'value'
Я не могу определить, почему это происходит? Я знаю, что эта ошибка означает, что она указывает на то, чего не существует, но я не знаю почему.
1 ответ
Я думаю, что все, что вам нужно, это изменить свой preOrder
способ остановиться, когда root
является None
:
def preOrder(root):
if root is None:
return
print(root.value)
print("root.value printed")
if root.left != 0:
preOrder(root.left)
if root.right != 0:
preOrder(root.right)
Кроме того, вам не нужно print(preOrder(tree))
можно просто сделать preOrder(tree)
, поскольку все, что он делает, это печатает дерево. В противном случае вы получите дополнительный None
напечатанный, который является возвращением по умолчанию метода, который ничего не возвращает.
Ваш отступ в вашем вопросе неверен, но я предполагаю, что это случайно.