题目描述:
错误解法:
最初的想法是对树进行中序遍历,判断得到的结果对应位置是否相同判断是否为镜像对称。
比如例子中的第一个树,中序遍历结果为[3,2,4,1,4,2,3],结果除了中间的1之外全部对称,则该树镜像对称。例子中的第二个树,中序遍历结果为[2,3,1,2,3]结果不对称,则该树不是镜像对称。
提交之后发现对某些特殊样例无法正确判断,比如测试样例[1,2,2,2,null,2],中序遍历结果为[2,2,1,2,2],结果完全对称,但其实该树不满足镜像对称条件。
class Solution(object): def isSymmetric(self, root): result = self.midorder(root) print(result) length = len(result) ll = int(len(result)/2) for i in range(ll): if result[i]!=result[length-i-1]: return False return True def midorder(self,root): res = [] if root==None: return res if root.left!=None: res = res + self.midorder(root.left) res.append(root.val) if root.right!=None: res = res + self.midorder(root.right) return res
正确解法:递归
如果一个树镜像对称:
根结点为空,返回True
判断root.left和root.right的节点值是否相同。
判断root.left的左子树和root.right的右子树是否相同。
判断root.left的右子树和root.right的左子树是否相同。
如果root则其左右子树应该完全对称,定义一个函数issame,
1.定义一个判断
class Solution(object): def isSymmetric(self, root): if root==None: return True return self.issame(root.left,root.right) def issame(self,left, right): if left == None and right == None: return True if left == None or right == None: return False if left.val != right.val: return False return self.issame(left.left, right.right) and self.issame(left.right, right.left)
另解:
树的前序遍历和后序遍历结果互逆是对称二叉树的性质,可以利用该性质完成判断。