二叉树对称性判断代码输出错误求助(LeetCode习题)
二叉树对称判断的代码修正与问题分析
先看修正后的可运行代码,实现了二叉树对称判断:
class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right def isSymmetric(root): def is_mirror(left, right): # 两个节点都为空,对称 if not left and not right: return True # 其中一个为空,另一个不为空,不对称 if not left or not right: return False # 当前节点值相等,且左的左和右的右对称,左的右和右的左对称 return (left.val == right.val) and is_mirror(left.left, right.right) and is_mirror(left.right, right.left) if not root: return True return is_mirror(root.left, root.right) # 测试用例 l = TreeNode(1, TreeNode(2, TreeNode(3), TreeNode(4)), TreeNode(2, TreeNode(4), TreeNode(3))) print(isSymmetric(l)) # 输出 True
原代码的核心问题分析:
Tree类初始化逻辑错误
原__init__方法中,当传入lc和rc后,又重新创建了空的Tree()对象覆盖了传入的子节点,导致树结构完全没有正确构建。比如Tree(2, 3, 4)本应创建一个值为2,左子节点值为3、右子节点值为4的节点,但原代码会把self.lc设为Tree()(空节点),完全丢失了传入的子节点数据。实例方法缺少self参数
原代码中的lsym(t)、rsym(t)、mirror(t)、isSame(t)这些方法都没有将self作为第一个参数,Python中实例方法必须接收自身实例作为第一个参数,否则调用时会抛出参数数量不匹配的错误,或者无法正确访问实例属性。方法调用错误(未执行方法,而是比较方法对象)
比如if t.lc.getlabel != t.rc.getlabel中,getlabel是方法对象,不是调用后的返回值,正确写法应该是t.lc.getlabel();同理if t.lc.lc.isSame and t.rc.rc.isSame也是在比较方法对象,而不是执行方法判断结果。递归逻辑混乱且无终止条件
lsym和rsym方法没有处理节点为空的情况,会无限递归直到报错;isSame方法的逻辑完全颠倒,比如在节点值相等的情况下反而返回False,完全不符合对称判断的逻辑。
正确的对称判断思路
判断二叉树是否对称,本质是判断根节点的左右子树是否互为镜像:
- 两个子树的根节点值相等
- 左子树的左子树和右子树的右子树互为镜像
- 左子树的右子树和右子树的左子树互为镜像
通过递归实现这三个条件即可完成判断。
内容的提问来源于stack exchange,提问作者Giulia Cocchi
相关产品推荐
相关产品推荐

