You need to enable JavaScript to run this app. Python实现二叉搜索树递归搜索时方法返回None的问题
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.30 18:06:04