You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python递归遍历疾病树形结构时searchForNode方法返回None的问题求解

Python递归遍历疾病树形结构时searchForNode方法返回None的问题求解

我仔细看了你的代码,问题的核心在于searchForNode的递归逻辑里,当在子树中找到目标节点时,你没有把这个结果传递回上层调用,导致整个函数最后没有有效返回值,默认返回了None。

问题具体分析

在你现有的代码中,递归调用self.searchForNode(nodeToSearch, children)时,只是执行了这个方法,但没有接住它的返回值并继续向上传递。比如当在某个子节点的leadTo列表里找到目标节点时,这个结果只会停在那一层递归中,无法传递给上层调用方,所以外层函数最后没有return任何有效内容,自然返回了None。

修复后的searchForNode方法

下面是修复好的版本,我标注了关键修改点:

def searchForNode(self, nodeToSearch, parent=None):
    if parent is None: # 从根节点开始遍历
        parent = self.root
    
    for node in parent:
        # 先检查当前节点是否匹配目标
        if node == nodeToSearch:
            # 这里建议直接返回原节点,避免创建副本丢失原引用(如果业务需要副本可保留原逻辑)
            print("找到匹配节点: " + str(node))
            return node

        # 遍历当前节点的子节点
        children = node.leadTo
        if children is not None and len(children) > 0:
            # 关键修改:接住递归的返回结果,找到目标就立即返回
            found_node = self.searchForNode(nodeToSearch, children)
            if found_node is not None:
                return found_node
    
    # 遍历完所有节点都没找到,返回None
    return None

关键修改说明

  1. 传递递归搜索结果:当递归搜索子树时,把结果存到found_node变量中,如果这个变量不为None(说明找到目标),就立刻返回它,让结果逐层传递回最初的调用方。
  2. 优化遍历顺序:先检查当前节点是否匹配,再去递归子节点,逻辑更符合直观的搜索顺序。
  3. 严谨处理空子节点:增加len(children) > 0的判断,避免对空列表做无意义的递归。
  4. 返回原节点(可选优化):原代码中新建了ConditionNode副本返回,这会导致你拿到的是和原树节点内容相同但引用独立的对象。如果你的业务需要操作原树中的节点,直接返回原节点更合理;如果确实需要副本,可以保留原创建逻辑,但要记得把副本返回出去。

额外优化建议

  • 你的__eq__方法仅通过diseaseName匹配节点,这符合当前业务需求,但如果后续需要扩展匹配规则(比如结合isTreated状态),可以修改这个方法。
  • 在insertToTree方法中,当处理已存在的节点时,你直接赋值覆盖了leadTo列表,这会丢失原有的子节点。如果业务需求是追加子节点而非替换,应该使用existingNode.leadTo.extend(leadTo)而非直接赋值。

备注:内容来源于stack exchange,提问作者Sam Y

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 08:49:31