0

我试图在Python3.7中实现二叉搜索树的一些基本操作。我刚从 Hackerrank 开始编码问题,在 BST 中实现 levelOrder 遍历时遇到了困难。我应该怎么做才能解决这个 AttributeError: 'int' object has no attribute 'data'?

我正在使用队列来解决这个问题,最初,队列将指向根节点,然后检查左右子节点。如果找到,孩子将被追加到队列中,并且该过程继续进行,直到队列为空。我在每次迭代中弹出第一个元素并将其存储在 temp 变量中。这样我将在树的每一级获得节点。

class Node:
    def __init__(self, data):
        self.data = data
        self.leftChild = None
        self.rightChild = None

    def insert(self, data):
        if self.data is not None:
            if data < self.data:
                if self.leftChild is None:
                    self.leftChild = Node(data)
                else:
                    self.leftChild.insert(data)
            elif data > self.data:
                if self.rightChild is None:
                    self.rightChild = Node(data)
                else:
                    self.rightChild.insert(data)
        else:
            self.data = data

    def traverseLevelOrder(self):
        queue = []
        queue.append(self.data)
        while queue:
            # Print front of queue and remove it from queue
            print(queue[0].data)
            temp = queue.pop(0)

            # Enqueue left child
            if temp.leftChild is not None:
                queue.append(temp.leftChild)

            # Enqueue right child
            if temp.rightChild is not None:
                queue.append(temp.rightChild)


class BST:
    def __init__(self):
        self.rootNode = None

    def insert(self, data):
        if self.rootNode is None:
            self.rootNode = Node(data)
        else:
            self.rootNode.insert(data)

    def traverseLevelOrder(self):
        if self.rootNode is None:
            return
        else:
            self.rootNode.traverseLevelOrder()


bst = BST()
bst.insert(2)
bst.insert(4)
bst.insert(1)
bst.insert(3)
bst.traverseLevelOrder()

代码应该返回如下所示的级别遍历顺序(在一个级别内,它应该首先打印左节点,然后是右节点):

2
1
4
3

相反,我遇到以下错误:

Traceback (most recent call last):
    print(queue[0].data)
AttributeError: 'int' object has no attribute 'data'
4

2 回答 2

1

您将一个整数附加self.data到队列中,然后尝试使用 访问整数上的属性queue[0].data,从而AttributeError引发 。

相反,将节点本身附加:

queue.append(self)
于 2019-06-11T20:46:40.860 回答
0
queue.append(self.data)

你的意思:

queue.append(self)

?

现在您只是将一个数字添加到队列中,而不是整个对象。

于 2019-06-11T20:46:46.883 回答