检查二叉树对称性的代码未达预期,求问题原因
问题分析与修复:二叉树对称判断代码失效原因
问题根源
你的代码失效的核心原因是**invertTree函数是原地修改原树**,而非创建一个新的反转树。
当你调用inverted_root = invertTree(root)时,函数会直接修改传入的root节点的左右子树指针,此时root本身已经变成了反转后的树。后续调用isSameTree(root, inverted_root)其实是在比较同一个树对象,自然永远返回True,完全失去了判断的意义。
比如你测试的输入root = [1,2,2,null,3,null,3],调用invertTree后原树被修改,此时root和inverted_root指向的是同一个修改后的树,所以isSameTree必然返回True,但原树实际并不对称。
修复方案
修改invertTree函数,让它创建新的节点来构建反转树,而不是原地修改原树:
# Definition for a binary tree node. # class TreeNode: # def __init__(self, val=0, left=None, right=None): # self.val = val # self.left = left # self.right = right class Solution: def isSymmetric(self, root: Optional[TreeNode]) -> bool: def invertTree(root: Optional[TreeNode]) -> Optional[TreeNode]: if root is None: return None # 创建新节点,而非修改原节点的左右指针 new_root = TreeNode(root.val) new_root.left = invertTree(root.right) new_root.right = invertTree(root.left) return new_root def isSameTree(p: Optional[TreeNode], q: Optional[TreeNode]) -> bool: if p is None and q is None: return True elif p is not None and q is None: return False elif p is None and q is not None: return False elif p.val != q.val: return False return isSameTree(p.left, q.left) and isSameTree(p.right, q.right) inverted_root = invertTree(root) return isSameTree(root, inverted_root)
更高效的思路(可选)
其实不需要反转整个树再比较,直接递归比较原树的左子树和右子树是否镜像对称即可,这样可以节省空间:
class Solution: def isSymmetric(self, root: Optional[TreeNode]) -> bool: def isMirror(p: Optional[TreeNode], q: Optional[TreeNode]) -> bool: if not p and not q: return True if not p or not q: return False return p.val == q.val and isMirror(p.left, q.right) and isMirror(p.right, q.left) return isMirror(root.left, root.right) if root else True
内容的提问来源于stack exchange,提问作者user1190361
相关产品推荐
相关产品推荐

