Ошибка атрибута во время бинарного дерева поиска? - PullRequest
0 голосов
/ 14 ноября 2018

Я пытаюсь написать программное обеспечение для печати 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 Ответ

0 голосов
/ 14 ноября 2018

Я думаю, все, что вам нужно, это изменить свой 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)), вы можете простоdo preOrder(tree), так как все, что он делает, это печатает дерево.В противном случае вы получите дополнительный None, который является значением по умолчанию для метода, который ничего не возвращает.

Ваш отступ в вашем вопросе неверен, но я предполагаю, что это случайно.

...