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,这是怎么回事?
问题分析
首先拆解三次调用的打印结果(每两行对应一次递归调用):
- 第一次调用(根节点对比):q是根节点1(非空),p是根节点1(非空),所以
q != None为True,not p为False,第一个if不触发。 - 第二次调用(左子树对比):q是节点2(非空),p是None,此时
q != None and not p条件完全成立,这个递归分支确实返回了False——但你的代码在第一次调用里,只是执行了self.isSameTree(q.left, p.left),却没有接收这个返回值,也没有终止后续流程,导致程序继续执行右子树的递归调用。 - 第三次调用(右子树对比):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
相关产品推荐
相关产品推荐

