用了两种方法解题: 先说第一种,用中序遍历的方法遍历一遍,然后将结果翻转看是否不变,如果是则是对称,否则不对称,但是这种方法存在一些情况会错误,因此需要加一些特殊情况的判断。 第二种方法,传两棵树进去,这两颗树是树A和树A对称翻转后的树B,因此只需要判断下树A和树B是否一致就可以了。但是我们直接翻转一下树很麻烦,因此其实可以传两颗树A进去,然后用树A的左子树和树B的右子树去比,树A的右子树和树B的左子树去比即可。
import copy
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
#
# @param pRoot TreeNode类
# @return bool布尔型
#
class Solution:
def isSymmetrical1(self , pRoot: TreeNode) -> bool:
# write code here
# 得到中序遍历结果,看是否正反一致
self.res = []
self.midtra(pRoot)
tmp = copy.deepcopy(self.res)
tmp.reverse()
if len(self.res)>=3:
if pRoot.left.val != pRoot.right.val:
return False
if self.res == tmp:
return True
else:
return False
def midtra(self , root):
if root:
self.midtra(root.left)
self.res.append(root.val)
self.midtra(root.right)
def isSymmetrical(self , pRoot: TreeNode) -> bool:
self.tag = 0
self.check(pRoot , pRoot)
if self.tag == 1:
return False
else:
return True
def check(self , root1 , root2):
# 分别传入左右子树
if (root1==None and root2!=None) or (root2==None and root1!=None):
self.tag=1
return
elif (root1==None and root2==None):
return
elif root1.val != root2.val:
self.tag=1
return
else:
self.check(root1.left , root2.right)
self.check(root1.right , root2.left)
root = TreeNode(1)
root.left = TreeNode(2)
root.right = TreeNode(3)
print(Solution().isSymmetrical(root))