Двоичное дерево Python - AttributeError: у объекта 'NoneType' нет атрибута 'left' - PullRequest
0 голосов
/ 16 февраля 2020

Я пытаюсь добавить элементы в двоичное дерево и печатать их в предварительном порядке.

Элементы, добавляемые в двоичное дерево, имеют тип узла.

I ' Получается ошибка при добавлении элемента: AttributeError: 'NoneType' object has no attribute 'left'

Пожалуйста, дайте мне знать, где я должен внести изменения. Ниже приведен код:

class Node(object):

    def __init__(self, item, left=None, right=None):
        self.item = item
        self.left = None
        self.right = None

    def __repr__(self):
        return '{}'.format(self.item)


class BinaryTree(object):

    def __init__(self, root=None):
        self.root = root

    def add(self, value):

        val = self.root
        if not val:
            val = value
        elif not val.left:
            val = value
        elif not val.right:
            val = value
        else:
            self.left = val.left.add(value)
        return val

    def preorder(self):
        val = self.root
        print(val)
        if val.left:
            val.left.preorder()
        if val.right:
            val.right.preorder()


def main():

    binary_tree = BinaryTree()

    print("Adding nodes in tree")
    for i in range(1, 11):
        node = Node(i)
        binary_tree.add(node)

    print("Printing preorder...")
    binary_tree.preorder()

if __name__ == '__main__':
    main()

Ошибка:

Adding nodes in tree
Printing preorder...
None
Traceback (most recent call last):
  File ".\binary_tree_test5.py", line 52, in <module>
    main()
  File ".\binary_tree_test5.py", line 49, in main
    binary_tree.preorder()
  File ".\binary_tree_test5.py", line 33, in preorder
    if val.left:
AttributeError: 'NoneType' object has no attribute 'left'

Ответы [ 2 ]

0 голосов
/ 16 февраля 2020

binary_tree = BinaryTree() - BinaryTree.__init__ имеет аргумент по умолчанию None для параметра root. Когда вы добавляете Node и проверяете наличие root, если его нет, вы должны сделать его.

....
    def add(self, value):
        val = self.root
        if not val:
            self.root = value
            val = value
        ...

Или

....
    def add(self, value):    
        if not self.root:
            self.root = value
        val = self.root
        ...

Это решит проблема наличия root из None до тех пор, пока вы вызываете add в пустом дереве, прежде чем делать что-либо еще.

Если вы хотите сохранить возможность создания пустых деревьев, вы можете рассмотреть добавление значимого исключения к методам, которые не будут работать для дерева без корней.

class RootLessException(Exception):
    pass
...
...
    def preorder(self):
        if not self.root:
            raise RootLessException
        val = self.root
        ...
0 голосов
/ 16 февраля 2020
  • в вашем коде это тот случай, когда ваш узел root равен нулю.
  • Вы можете предотвратить это, проверив root значения.
def preorder(self):
    val = self.root
    if not val: # this will handle the case when root node is None.
        return 
    print(val)
    if val.left:
        val.left.preorder()
    if val.right:
        val.right.preorder()

PS: я думаю, что ваш add метод неверен. Вы можете отладить эту часть для любых других проблем.

...