判断二叉树是否相同的递归函数:为何调用栈因逻辑与短路求值完全回退?
为什么递归比较二叉树时AND语句后半部分未执行?
这个现象的核心原因是Python里的and运算符是短路求值的,具体过程拆解如下:
- 第三次调用
sameTree(1, None)返回False后,这个结果会传递回第二次调用的sameTree(s.left,t.left)位置。 - 逻辑与
and的规则是:只要左边表达式结果为False,整个表达式的结果必然是False,所以Python不会再去执行右边的sameTree(s.right, t.right),直接把False返回给上一层调用。 - 接着这个
False又成为第一次调用中sameTree(s.left,t.left)的结果,同样触发短路逻辑,第一次调用的sameTree(s.right, t.right)也不会执行,直接返回False,整个调用栈开始逐层回退。
简单来说,短路求值就是“能省则省”——既然左边已经确定结果是错的,右边再执行也改变不了最终结论,干脆就跳过不执行了,这是Python逻辑运算符的默认行为,不光递归场景,所有用到and的地方都是如此。
附上你的代码供参考:
class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right x = TreeNode(4,TreeNode(1,TreeNode(1)),TreeNode(2)) y = TreeNode(4,TreeNode(1),TreeNode(2)) def sameTree(s,t): if not s and not t: return True if s and t and s.val == t.val: return (sameTree(s.left,t.left) and sameTree(s.right, t.right)) return False sameTree(x,y)
内容的提问来源于stack exchange,提问作者Yazid
相关产品推荐
相关产品推荐

