BST类insert方法用递归时触发NameError: name 'insert'未定义如何解决
错误原因
出现该报错的核心原因有两个:
- 作用域调用错误:
insert是Bst类的实例方法,不属于全局作用域的可调用函数,你直接在方法内部写insert(self.root.left,data)时,Python会先在insert方法的局部作用域找insert函数,找不到就去全局作用域找,自然找不到对应定义,就抛出NameError: name 'insert' is not defined。 - 方法参数和逻辑设计错误:你定义的
insert方法仅接收data一个入参,递归调用时传入了两个参数,就算作用域问题解决,调用也会报参数数量不匹配的错误;同时self.root.left是节点对象,不是Bst类的实例,也不具备insert方法。
另外你的代码还隐含node类未定义的问题,调用node(data)前需要先实现节点类。
修复方案
最常用的修复方式是在insert方法内封装私有递归辅助函数处理插入逻辑,示例代码如下:
# 先实现节点类 class Node: def __init__(self, data): self.data = data self.left = None self.right = None class Bst: def __init__(self): self.root = None def insert(self, data): # 内部递归函数:接收当前节点、待插入数据,返回插入后的节点 def recursive_insert(current_node, data): # 当前节点为空,直接生成新节点返回 if not current_node: return Node(data) # 小于等于当前节点值,插入左子树 if data <= current_node.data: current_node.left = recursive_insert(current_node.left, data) # 大于当前节点值,插入右子树 else: current_node.right = recursive_insert(current_node.right, data) return current_node # 从根节点开始递归插入 self.root = recursive_insert(self.root, data)
这种写法的优势是递归逻辑和外部实例方法隔离,不需要调整对外的insert方法的入参结构,符合BST类的封装特性。
内容的提问来源于stack exchange,提问作者Ripson Pereira
相关产品推荐
相关产品推荐

