题目描述
请实现一个函数,用来判断一棵二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。
输入输出示例
示例1
输入:{8,6,6,5,7,7,5}
返回值:true
示例2
输入:{8,6,9,5,7,7,5}
返回值:false
解题思路
二叉树的每个节点的左右子树都是一个镜像文件,即此二叉树就是对称二叉树(只有根节点或者树为空的情况也都为对称二叉树)。
- 定义判断是否是镜像的函数,传入参数为左子树和右子树,用于判断每次左右子树是否是镜像的:
此函数中,
- 如果左节点和右节点都为空,表示没有左右子树,是对称二叉树,返回True;
- 如果左节点或者右节点一个为空,表示左右子树只存在一个,那一定不是对称二叉树返回False;
- 其他情况,就是同时存在左右子树,一种是存在但左右节点的值不相等,不是对称二叉树;另一种是存在且左右节点的值相等,则继续递归比较左右子树下的左右子节点是否满足镜像(左子树的左节点等于右子树的右节点,左子树的右节点等于右子树的左节点),如果同时满足,则说明该二叉树是对称二叉树,返回True,有任意一个是False都返回False
- 考虑边界条件,即树为空的情况,属于对称二叉树直接返回True,
- 否则,树不为空的情况下,判断当前根节点的左子树与右子树是否满足呈镜像二叉树
代码示例
# coding:utf-8
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
class Solution:
def isSymmerical(self, pRoot):
# 定义一个函数,用于判断左右节点是否构成镜像二叉树
# 根节点的左右节点相等,左节点的左节点等于右节点的右节点;左节点的右节点等于右节点的左节点
def isMirror(left, right):
# 如果左节点和右节点都为空,则是对称二叉树
if left == None and right == None:
return True
# 如果有一个节点为空,一个节点不为空,则不是对称的
elif left == None or right == None:
return False
# 存在左右节点,
else:
# 但左节点的值与右节点的值不相等,不是对称的
if left.val != right.val:
return False
# 存在且左右节点的值相等
# 继续递归判断左节点的子节点与右节点的子节点是否构成镜像
# 左节点的左子节点是否等于右节点的右子节点
ret1 = isMirror(left.left, right.right)
# 左节点的右子节点是否等于右节点的左子节点
ret2 = isMirror(left.right, right.left)
#返回两个结果的与结果 必须两个都满足才是对称的,返回True
return ret1 and ret2
# 边界条件:如果树为空,是对称的,返回True
if pRoot == None:
return True
# 否则递归比较根节点的左子树和根节点的右子树
return isMirror(pRoot.left, pRoot.right)
if __name__ == '__main__':
# 8, 6, 6, 5, 7, 7, 5
node1 =TreeNode(8)
node2 =TreeNode(6)
node3 =TreeNode(6)
node4 =TreeNode(5)
node5 =TreeNode(7)
node6 =TreeNode(7)
node7 =TreeNode(5)
node1.left = node2
node1.right = node3
node2.left = node4
node2.right = node5
node3.left = node6
node3.right = node7
s = Solution()
res = s.isSymmerical(node1)
print(res)