二叉树Python-AttributeError:';非类型';对象没有属性';左';

二叉树Python-AttributeError:';非类型';对象没有属性';左';,python,binary-tree,Python,Binary Tree,我正在尝试将元素添加到二叉树中,并按预定顺序打印它们 添加到二叉树的元素的类型为node 我在添加元素时出错: AttributeError:'NoneType'对象没有属性'left' 请让我知道我在哪里需要改变 代码如下: class Node(object): def __init__(self, item, left=None, right=None): self.item = item self.left = None self

我正在尝试将元素添加到二叉树中,并按预定顺序打印它们

添加到二叉树的元素的类型为node

我在添加元素时出错:
AttributeError:'NoneType'对象没有属性'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'
在树中添加节点
打印预订单。。。
没有一个
回溯(最近一次呼叫最后一次):
文件“\binary\u tree\u test5.py”,第52行,在
main()
文件“\binary\u tree\u test5.py”,第49行,主目录
二叉树.预序()
文件“\binary\u tree\u test5.py”,第33行,预排序
如果val.left:
AttributeError:“非类型”对象没有属性“左”
  • 在您的代码中,根节点为null时就是这种情况
  • 可以通过检查根值来防止这种情况
def预订单(self):
val=self.root
如果不是val:#这将处理根节点为None的情况。
返回
打印(val)
如果val.left:
val.left.preorder()
如果val.right:
val.right.preorder()

PS:我认为你的
add
方法是错误的。您可以调试该部分以解决任何其他问题。

binary\u tree=BinaryTree()
-
BinaryTree。
根参数的默认参数为
None
。当您添加一个
节点
并检查根节点时,如果它没有根节点,您应该创建一个

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

这将解决
None
的问题,只要在执行任何其他操作之前在空树上调用
add

如果你想保持创建空树的选项,你可以考虑不支持无根树的方法。

class RootLessException(Exception):
    pass
...
...
    def preorder(self):
        if not self.root:
            raise RootLessException
        val = self.root
        ...

请添加完整回溯以帮助调试错误。仅添加错误类型没有帮助。
add()
如何将节点添加到树中?@Poojan-添加了完整的回溯我正在尝试实现一个二叉树,而不是二叉搜索树,并将一个节点类型的对象传递到二叉树中供您输入,是的,实际上add方法不起作用-打印时它只显示第一个元素。我应该发布一个不同的问题,还是编辑这个问题?
class RootLessException(Exception):
    pass
...
...
    def preorder(self):
        if not self.root:
            raise RootLessException
        val = self.root
        ...