给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [1,2,2,3,4,4,3]
是对称的。
1
/ \
2 2
/ \ / \
3 4 4 3
但是下面这个 [1,2,2,null,3,null,3]
则不是镜像对称的:
1
/ \
2 2
\ \
3 3
思路:关于树的问题,尽量用递归的思想去解决。因为树的定义也是递归定义的。何为镜像对称呢?就是这个树的左子树和右子树的节点都是对称的。①递归法:因此可以把这个树copy一份,变成两个树,然后观察这两个树的左子树和右子树是不是对称的,也就是右子树的左节点等于左子树的右节点,这样递归的判断下去。最终就可以判断出来这棵树是不是镜像对称。②迭代法:总体思路和递归相差不是太大,定义一个队列,然后一次加入一对节点,然后去判断节点的值是不是相同。
1、递归法
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
#定义一个递归函数判断左右子树是不是镜面对称
def isSymmetricJudge(self,left,right):
#如果左右子树都是空的,那么就是镜面对称
if left is None and right is None:
return True
#如果左右子树有一个子树是空,另一个非空,那肯定不是镜面对称
if left is None or right is None:
return False
#接下来就详细的判断,节点的值必须相同,且递归的判断左节点的左和右节点的右;
#左节点的右和右节点的左相等
return left.val==right.val and self.isSymmetricJudge(left.left,right.right) and self.isSymmetricJudge(left.right,right.left)
def isSymmetric(self, root: TreeNode) -> bool:
#如果树为空,就是对称树
if not root:
return True
else:
return self.isSymmetricJudge(root,root)
2、迭代法
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def isSymmetric(self, root: TreeNode) -> bool:
#定义一个队列
queue = collections.deque()
#加入一对根节点
queue.append((root, root))
while queue:
#从队列中取出元素
left, right = queue.popleft()
if not left and not right:
continue
if not left or not right:
return False
if left.val != right.val:
return False
#加入左子树的左节点和右子树的右节点
#加入右子树的左节点和左子树的右节点
queue.append((left.left, right.right))
queue.append((left.right, right.left))
return True