题目描述:
给你一个二叉树的根节点 root
, 检查它是否轴对称。
递归求解:
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
class Solution:
def isSymmetric(self, root):
if not root:
return True
return self.deepCheck(root.left,root.right)
# 比较两个结点
def deepCheck(self,left,right):
# 考虑'NoneType’ object has no attribute 'val'
if left is None and right is None: # 两者均为空
return True
if left is None or right is None: # 只有一者为空
return False
if left.val != right.val:
return False
return self.deepCheck(left.left,right.right) and self.deepCheck(left.right,right.left) # 两个分支都要比较
循环求解:
以这颗满二叉树为例理解循环的过程:
我们需要建立一个辅助队列:
step1:1的左孩子2进队,1的右孩子2进队;
step2:队首两个元素出队,2的左孩子3进队,2的右孩子3进队;2的右孩子4进队,2的左孩子3进队。
step3:队首两个元素出队,3的左孩子为None,3的右孩子为None;3的右孩子为None,3的左孩子为None;
step4:队首两个元素出队,4的左孩子为None,4的右孩子为None;4的右孩子为None,4的左孩子为None;
总结规律:对于出队的两个元素比较值时,我们同时要将他们的左右孩子按照次序入队。
class Solution:
def isSymmetric(self, root):
if not root:
return True
# 可以用列表实现队列
queue = []
u = root.left
v = root.right
if u is None and v is None:
return True
queue.append(u)
queue.append(v)
# 循环的过程是判断是否会出现不相等情况
while len(queue) != 0:
u = queue.pop()
v = queue.pop()
if u is None and v is None:
continue
# 注意与递归return True的区别
if u is None or v is None:
return False
if u.val != v.val:
return False
queue.append(u.left)
queue.append(v.right)
queue.append(u.right)
queue.append(v.left)
return True