二进制搜索树顺序不起作用 (python)

Binary Search Tree inorder not working (python)

我一直在忙着学习对象和 classes,当我终于觉得我设法围绕如何在 python 中构建二叉搜索树时,我运行 成问题。这是我的代码:

class node:
    def __init__(self,value):
        self.value = value
        self.left = None
        self.right = None

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

    def add(self,current,value):
        if self.root == None:
            self.root = node(value)
        else:
            if value < current.value:
                if current.left == None:
                    current.left = node(value)
                else:
                    self.add(current.left,value)
            if value > current.value:
                if current.right == None:
                    current.right = node(value)
                else:
                    self.add(current.right,value)

    def visit(self,node):
        print(node.value)

    def inorder(self,current):
        self.inorder(current.left)
        self.visit(current)
        self.inorder(current.right)

Tree = BST()
root = node(2)
Tree.root = root
Tree.add(Tree.root,7)

Tree.inorder(Tree.root)

在 运行 代码之后,我得到一个错误:AttributeError: 'NoneType' object has no attribute 'left'。 错误来自 inorder 函数,显然我插入函数的值是一个没有类型的对象。 如您所见,树的根是一个节点对象,因此它应该具有 class 中编码的属性“left”。如果有人可以帮助我解决我的错误,我将不胜感激。 提前致谢!

编辑:我应该注意,我检查了根是否是具有 isinstance() 函数的节点,并且确实返回了 True。

我想你应该先检查电流是否 None 然后再访问它的左右。

  def inorder(self, current):
        if current:
            self.inorder(current.left)
            self.visit(current)
            self.inorder(current.right)

您的设计有一些问题。树应该是唯一知道根的对象。您不必传递根目录。请注意这样使用起来更简单:

class node:
    def __init__(self,value):
        self.value = value
        self.left = None
        self.right = None

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

    def add(self,value,current=None):
        if not self.root:
            self.root = node(value)
            return

        if not current:
            current = self.root

        if value < current.value:
            if not current.left:
                current.left = node(value)
            else:
                self.add(value,current.left)
        else:
            if not current.right:
                current.right = node(value)
            else:
                self.add(value, current.right)

    def visit(self,node):
        print(node.value)

    def inorder(self,current=-1):
        if current == -1:
            current = self.root
        if not current:
            return
        self.inorder(current.left)
        self.visit(current)
        self.inorder(current.right)

Tree = BST()
Tree.add(2)
Tree.add(7)

Tree.inorder()