LeetCode对称树问题:翻转树+中序遍历解法为何未通过全部用例
对称树判定解法的逻辑问题说明
你的解法核心错误是错误认为「中序遍历结果相等」等价于「树结构镜像对称」,这个逻辑从根上就不成立,具体问题拆成三点说:
- 中序遍历只记录非空节点的取值,不保留空节点的位置信息,结构完全不同的两棵树,完全可能生成一模一样的中序遍历序列。你没通过的测试用例
[1,2,2,2,null,2]就是典型:原树的结构是根节点1的左右子节点都是2,左子节点2只有左孩子(值为2)、右孩子为空,右子节点2只有左孩子(值为2)、右孩子为空——这棵树明显不对称,但你对它做翻转之后,中序遍历得到的值序列和原树完全一致,自然会误判返回True。
再举个更极端的反例:所有节点都沿左子树串成链的[1,2,null,3],和所有节点沿右子树串成链的[1,null,2,null,3],中序遍历结果都是[3,2,1],但两棵树结构天差地别,根本不可能满足对称要求。 - 你的
invert函数是原地修改输入的二叉树结构,这种直接篡改输入参数的写法,在算法题中很容易引入意料之外的边界问题,而且完全没有必要。 - 对称树的正确判定逻辑不需要做整树翻转,本质只需要判断:根节点的左子树,是否和根节点的右子树互为镜像。判断两个子树互为镜像的标准非常直接:
- 两个子树的根节点值相等
- 左子树的左孩子,和右子树的右孩子互为镜像
- 左子树的右孩子,和右子树的左孩子互为镜像
递归判定的过程中会自然校验空节点的位置匹配,不会出现结构不一致但序列相等的误判。
附正确的递归实现参考:
# 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 is_mirror(a: Optional[TreeNode], b: Optional[TreeNode]) -> bool: if not a and not b: return True if not a or not b: return False return a.val == b.val and is_mirror(a.left, b.right) and is_mirror(a.right, b.left) return is_mirror(root.left, root.right)
内容的提问来源于stack exchange,提问作者mjk4331
相关产品推荐
相关产品推荐

