解题思路:
递归:从根节点开始遍历树,若一个树为空,则该树为对称树,返回True,若这个树不为空,则使用递归判断其是否为对称二叉树。
对称可以考虑为该节点的左子树的左子树和右子树的右子树相同。
若一个二叉树是对称的,那么其子树肯定也是对称的,所以可以使用递归来判断。
设置最后跳出的情况为:1.左右节点都为空;2.左右节点有一个非空;3.左右节点不相等
class Solution:
def son(self, p, q):
if not (p or q):
return True
if not (p and q):
return False
if p.val != q.val:
return False
return self.son(p.left, q.right) and self.son(p.right, q.left)
def isSymmetric(self, root: TreeNode) -> bool:
if not root:
return True
return self.son(root.left, root.right)
迭代:
使用queue队列保存目前比较的左右两个节点,以上图中的[1,2,2,3,4,4,3]树为例,第一步将根节点下的左右节点放入queue队列中,此时queue为[2,2],left为queue[0],right为queue[1],使用动态循环判断树的状态,使得left=queue.pop(0),right = queue.pop(0)(先放左,后放右节点),若左右节点都为空则返回True,若左右节点不相等或者只有一个是空的节点,则返回False,若相等的话则继续遍历,将当前节点的左右节点都添加到queue中,再循环pop判断,直到queue中没有值为止。
注:在往queue队列中放入数据的时候要注意放入数据的顺序。左子树的左节点应该紧跟着右子树的右节点。左子树的右节点紧跟着右子树的左节点。(左右节点要对应)
class Solution(object):
def isSymmetric(self, root):
if not root or not (root.left or root.right):#若树为空,或者为单个节点
return True
queue = [root.left,root.right]# 用队列保存节点
while queue:
# 从队列中取出两个节点,再比较这两个节点
left = queue.pop(0)
right = queue.pop(0)
# 如果两个节点都为空就继续循环,两者有一个为空就返回false
if not (left or right):
continue
if not (left and right):
return False
if left.val!=right.val:
return False
# 将左节点的左孩子, 右节点的右孩子放入队列
queue.append(left.left)
queue.append(right.right)
# 将左节点的右孩子,右节点的左孩子放入队列
queue.append(left.right)
queue.append(right.left)
return True