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

Python if语句逻辑异常:双True条件未返回预期False问题排查

相同树问题代码调试分析

问题场景

我在解决LeetCode相同树问题时写了这段Python代码:

class Solution:
    def isSameTree(self, q, p):

        print(q != None)
        print(not p)
        if q != None and not p:
            return False
        
        if q and p:
            if q.val == p.val:
                self.isSameTree(q.left, p.left)
                self.isSameTree(q.right, p.right)
        
        return True    

输入用例:q = [1,2],p = [1,null,2],运行输出:

True
False
True
True
False
False

我观察到第二次调用时,q != None为True,not p为True,但对应的if语句似乎没返回False,这是怎么回事?

问题分析

首先拆解三次调用的打印结果(每两行对应一次递归调用):

  1. 第一次调用(根节点对比):q是根节点1(非空),p是根节点1(非空),所以q != None为True,not p为False,第一个if不触发。
  2. 第二次调用(左子树对比):q是节点2(非空),p是None,此时q != None and not p条件完全成立,这个递归分支确实返回了False——但你的代码在第一次调用里,只是执行了self.isSameTree(q.left, p.left),却没有接收这个返回值,也没有终止后续流程,导致程序继续执行右子树的递归调用。
  3. 第三次调用(右子树对比):q是None,p是节点2(非空),此时两个打印都为False,最后返回True。

最终整个函数返回True,是因为第一次调用的最后走到了return True,完全忽略了左子树递归返回的False。

除此之外,你的代码还存在一个漏判:只处理了q非空但p空的情况,没有处理p非空但q空的场景,这会导致类似的错误。

修正后的代码

class Solution:
    def isSameTree(self, q, p):
        # 两棵树都为空,判定为相同
        if not q and not p:
            return True
        # 其中一棵为空另一棵非空,判定为不同
        if not q or not p:
            return False
        # 节点值相等,且左右子树都相同才返回True
        return q.val == p.val and self.isSameTree(q.left, p.left) and self.isSameTree(q.right, p.right)

修正说明

  • 先处理最基础的空树判断,逻辑更清晰
  • 用not q or not p一次性覆盖“一空一非空”的所有情况,避免漏判
  • 递归调用时直接返回逻辑与的结果,确保只要有一个子树不相同,整个函数就会返回False,不会忽略递归结果

内容的提问来源于stack exchange,提问作者Zayum

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 23:25:21