二进制搜索树期间属性错误?

时间:2018-11-14 19:45:01

标签: python search binary-search-tree preorder

我正在尝试编写软件以预打印包含字符串的BST,这是我到目前为止的代码。由于某种原因,它将打印前两个字符串,然后崩溃,并给我一个“ AttributeError:'NoneType'对象没有属性'value'”错误

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 :(得分:0)

我认为您需要做的就是更改preOrder的方法以在rootNone时停止:

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打印,这是不返回任何内容的方法的默认返回。

您在问题中的缩进是错误的,但我认为这是偶然的。