Python实现二叉搜索树递归搜索时方法返回None的问题
代码存在的核心逻辑问题
你现在的实现始终返回None,本质是4个硬伤导致的,逐个拆解:
- 方法内存在无效的游离调用:你在方法开头写的
a = search(self.root),这个search既不是类的内部方法,也不是全局函数,实际执行时要么直接触发报错,要么这行调用本身完全脱离你的BST类逻辑,对后续递归没有任何作用。 - 节点值比较逻辑错位:你写的
self.root == key是直接拿整个Node对象实例和传入的数值型key做比较,二者类型完全不同,永远不可能匹配成功;必须访问节点的info属性做比较,也就是current_node.info == key才是有效判断。 - 递归遍历的锚点完全错误:你所有判断逻辑都绑定在
self.root(固定指向整棵树的根节点)上,递归调用时哪怕传入了self.root.right,方法内部还是会盯着根节点做判断,根本不会把传入的子节点当成新的遍历起点,相当于每次循环都在原地打转,永远走不到子树层级。 - 递归方法的参数设计错误:你的
search方法签名只接收key参数,没有预留“当前遍历节点”的入参位置,递归调用时根本无法把下一层要遍历的子节点传递到逻辑里,流程自然跑不通。
另外你之前做的临时变量+or组合返回的修改,逻辑上也违背了BST的搜索规则:不管key和当前节点值的大小关系,都会同时遍历左、右两个子树,这已经变成了普通二叉树的全量遍历,完全失去了BST搜索的效率优势,再加上之前的锚点错误,自然得不到正确结果。
修正后的可用实现
按照BST的搜索规则,需要把对外的搜索入口和内部递归的逻辑拆分,避免递归时的锚点混乱:
class Node: def __init__(self, info): self.info = info self.left = None self.right = None self.level = None class BinarySearchTree: def __init__(self): self.root = None # 对外暴露的搜索方法,仅需要传入目标key def search(self, key): # 从根节点启动递归搜索流程 return self._search_recursive(self.root, key) # 内部递归辅助方法,接收当前遍历节点、目标key def _search_recursive(self, current_node, key): # 遍历到空节点说明目标不存在,返回None if current_node is None: return None # 命中目标值,返回对应节点 if current_node.info == key: return current_node # 目标值大于当前节点值,进入右子树继续搜索 if key > current_node.info: return self._search_recursive(current_node.right, key) # 目标值小于当前节点值,进入左子树继续搜索 return self._search_recursive(current_node.left, key)
额外提醒:你测试时手动搭建的节点结构不符合二叉搜索树的规则(根节点值为1,左子节点为2、右子节点为3,违反了BST“左子节点值<当前节点值<右子节点值”的定义),就算修正了搜索逻辑,这种结构下也会出现搜索结果和预期不一致的问题,测试时需要按照BST的规则搭建树结构。
内容的提问来源于stack exchange,提问作者AD_101
相关产品推荐
相关产品推荐

