【问题标题】:AttributeError: 'int' object has no attribute 'insert'; Defining and calling a recursive methodAttributeError:“int”对象没有属性“insert”;定义和调用递归方法
【发布时间】:2017-12-19 00:02:27
【问题描述】:

我正在尝试为我的 Tree 类实现一个简单的“插入”方法:

    class Tree:
      def __init__(self, value):
        self.node = value
        self.leftChild = None
        self.rightChild  = None

      def insert(self, value):
        if self.node is None:
            self.node = value
            return True
        if self.node is not value:
            if self.node > value:
                if self.leftChild  is None:
                    self.leftChild  = value
                else:
                    return self.leftChild.insert(value)
            if self.node < value:
                if self.rightChild  is None:
                    self.rightChild  = value
                else:
                     return self.rightChild.insert(value)
        else:
            return False



tree = Tree(5)
tree.insert(6)
tree.insert(1)
tree.insert(10)

上面的代码给出以下错误:

AttributeError: 'int' 对象没有属性 'insert'

当通过 tree.insert(10) 调用 insert 方法时,错误出现在“return self.rightChild.insert(value)”行。

我尝试用“return insert(self.leftChild, value)”替换错误的行,但这给了我以下错误:

NameError:未定义全局名称“插入”

我不知道如何解决这个问题!

【问题讨论】:

    标签: python class recursion binary-search-tree


    【解决方案1】:

    您将左右孩子设置为 value,这是一个整数。要实现递归结构,您应该将它们设置为新的 Tree 对象;这样你就可以调用他们的 Tree 方法。这很容易解决 - 只需使用 Tree(value) 而不是 value

        class Tree:
          def __init__(self, value):
            self.node = value
            self.leftChild = None
            self.rightChild  = None
    
          def insert(self, value):
            if self.node is None:
                self.node = value
                return True
            if self.node is not value:
                if self.node > value:
                    if self.leftChild  is None:
                        self.leftChild  = Tree(value)
                    else:
                        return self.leftChild.insert(value)
                if self.node < value:
                    if self.rightChild  is None:
                        self.rightChild  = Tree(value)
                    else:
                         return self.rightChild.insert(value)
            else:
                return False
    
    
    
    tree = Tree(5)
    tree.insert(6)
    tree.insert(1)
    tree.insert(10)
    

    【讨论】:

    • 谢谢!如果我的问题非常基本,我深表歉意,但是为什么我们在为根节点分配值时不使用 呢?我们只是使用
    • 每棵树都需要知道三件事:它的左孩子(树)、右孩子(树)和它的值(只是一个数字)。这就是三个变量对应的内容。如果 tree.node 是一棵树,那么该树将有一个树的节点,而该树将有一个树的节点,我们将有无限下降并且实际上不会将值存储在任何地方。如果您将 self.node 重命名为 self.value 以提醒自己这是一个数字,可能会更清楚。
    • 把它想象成一个树形图:self.node是小圆圈里的数字,self.leftChild和self.rightChild是左右箭头。
    • 你拯救了这一天!!很棒的解释!非常感谢!
    • 很高兴为您提供帮助:)
    猜你喜欢
    • 2015-07-06
    • 1970-01-01
    • 1970-01-01
    • 2020-05-31
    • 2021-11-30
    • 2020-03-26
    • 2013-04-15
    • 2021-01-18
    • 2019-05-30
    相关资源
    最近更新 更多