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
关键修改说明
- 传递递归搜索结果:当递归搜索子树时,把结果存到
found_node变量中,如果这个变量不为None(说明找到目标),就立刻返回它,让结果逐层传递回最初的调用方。 - 优化遍历顺序:先检查当前节点是否匹配,再去递归子节点,逻辑更符合直观的搜索顺序。
- 严谨处理空子节点:增加
len(children) > 0的判断,避免对空列表做无意义的递归。 - 返回原节点(可选优化):原代码中新建了
ConditionNode副本返回,这会导致你拿到的是和原树节点内容相同但引用独立的对象。如果你的业务需要操作原树中的节点,直接返回原节点更合理;如果确实需要副本,可以保留原创建逻辑,但要记得把副本返回出去。
额外优化建议
- 你的
__eq__方法仅通过diseaseName匹配节点,这符合当前业务需求,但如果后续需要扩展匹配规则(比如结合isTreated状态),可以修改这个方法。 - 在
insertToTree方法中,当处理已存在的节点时,你直接赋值覆盖了leadTo列表,这会丢失原有的子节点。如果业务需求是追加子节点而非替换,应该使用existingNode.leadTo.extend(leadTo)而非直接赋值。
备注:内容来源于stack exchange,提问作者Sam Y
相关产品推荐
相关产品推荐

