【问题标题】:Maximum recursion depth exceeded when inserting in BST插入 BST 时超出最大递归深度
【发布时间】:2022-01-27 16:32:23
【问题描述】:

我正在尝试实现二叉搜索树,并且我相信我的 insert 方法的逻辑非常好,但是当我运行它时,我的代码会引发“超出比较的最大递归深度”错误。

更新:我编辑了我的代码以修复最大递归深度,但现在我得到了不同的 AttributeError。

以下是我更新后的代码:

class BSTNode:
    def __init__(self, key, value=None):
        self.key = key
        self.value = value
        self.left = None
        self.right = None
        
class BST:
    def __init__(self):
        self.root = None
        self.size = 0
        
    def insert(self, key, value):
        if self.root is None:
            self.root = BSTNode(key, value)
        elif key < self.root.key:
            if self.root.left is None:
                self.root.left = BSTNode(key, value)
            else:
                self.root.left.insert(key, value)
        elif key > self.root.key:
            if self.root.right is None:
                self.root.right = BSTNode(key, value)
            else:
                self.root.right.insert(key, value)
                
        return self.root
    
if __name__ == '__main__':
    T = BST()
    T.insert(5, 'Mujeeb')
    T.insert(4, 'Hamza')
    T.insert(7, 'Ayesha')
    T.insert(9, 'Mahnoor')
    T.insert(11, 'Ali')
    print(T.root.right.key)

我得到的错误:

---------------------------------------------------------------------------
RecursionError                            Traceback (most recent call last)
<ipython-input-29-1eef6d5c8be5> in <module>
     23     T = BST()
     24     T.insert(5, 'Mujeeb')
---> 25     T.insert(4, 'Hamza')
     26     T.insert(7, 'Ayesha')
     27 

<ipython-input-29-1eef6d5c8be5> in insert(self, key, value)
     15             self.root = BSTNode(key, value)
     16         elif key < self.root.key:
---> 17             self.root.left = self.insert(key, value)
     18         elif key > self.root.key:
     19             self.root.right = self.insert(key, value)

... last 1 frames repeated, from the frame below ...

<ipython-input-29-1eef6d5c8be5> in insert(self, key, value)
     15             self.root = BSTNode(key, value)
     16         elif key < self.root.key:
---> 17             self.root.left = self.insert(key, value)
     18         elif key > self.root.key:
     19             self.root.right = self.insert(key, value)

RecursionError: maximum recursion depth exceeded in comparison

更新后的代码出现的新错误:

AttributeError                            Traceback (most recent call last)
<ipython-input-23-8ebfd3bbaceb> in <module>
     30 if __name__ == '__main__':
     31     T = BST()
---> 32     T.insert(5, 'Mujeeb')
     33     T.insert(4, 'Hamza')
     34     T.insert(7, 'Ayesha')

<ipython-input-23-8ebfd3bbaceb> in insert(self, key, value)
     14         if self.root is None:
     15             self.root = BSTNode(key, value)
---> 16             self.root.insert(key, value)
     17         elif key < self.root.key:
     18             if self.root.left is None:

AttributeError: 'BSTNode' object has no attribute 'insert'

如果您能提供任何指标来说明我在哪里出了问题,我将不胜感激,谢谢。

【问题讨论】:

  • 你无限地调用self.insert。在右侧或左侧节点上调用insert
  • 你能详细说明一下吗?如果我在右节点或左节点上调用插入,则会抛出 Nonetype 对象没有属性插入的错误
  • root == None的情况你好像知道怎么处理了;将该逻辑应用于这些分支...
  • @ScottHunter 明白了!
  • @ScottHunter 将该逻辑扩展到这两种情况后,我得到一个不同的错误,即 BSTNode 没有属性插入...

标签: python python-3.x recursion data-structures binary-search-tree


【解决方案1】:

您的“插入”节点始终在树的根节点上运行。 它应该在它插入的任何节点上运行。

如果您使用单个类而不是一个类而不是一个类作为节点而另一个类作为树,那么可能会更容易,这样,每个节点都会有自己的“插入”方法来做正确的事情。

class BSTNode:
    def __init__(self, key, value):
        self.key = key
        self.value = value
        self.left = None
        self.right = None
        
    def insert(self, key, value):
        
        if key <= self.key:
            if not self.left:
                self.left = BSTNode(key, value)
            else:
                self.left.insert(key, value)
        elif key > self.key:
            if not self.right:
                self.right = BSTNode(key, value)
            else:
                self.right.insert(key, value)

【讨论】:

  • 这让我很清楚自己哪里出错了。我创建了另一个私有方法 _insert,它将 curr_node 作为参数之一,然后在将 self.root 设置为 curr_node 的普通插入方法中递归地使用此方法。我这样做是因为我想要 BSTNode 和 BST 的单独类
猜你喜欢
  • 2021-07-11
  • 2013-12-01
  • 2017-03-24
  • 2011-12-31
  • 2017-08-09
  • 2011-03-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多