题解:
两种方法进行求解,一种是递归法(DFS),一种是迭代法(BFS)
递归法:
递归法的思想在于一个结点的左右子树是对应的,因此设置两条路径(两个指针)访问,来看左右子树是否对应相等。
递归的终止条件:
- 如果两个结点都为None,返回True
- 如果一个为None, 一个不是,返回False
- 如果对应值不相等,返回False
class Solution:
def isSymmetric(self, root):
if not root:
return True
def dfs_double(A1,A2):
if A1 == None and A2 == None:
return True
if A1 == None or A2 == None:
return False
if A1.val != A2.val:
return False
return (dfs_double(A1.left,A2.right)
and dfs_double(A1.right,A2.left))
de = dfs_double(root.left,root.right)
return de
迭代法:
迭代法的思想与递归法类似,但是这次是设置两个队列,一个队列从左结点开始访问,一个队列从右结点开始访问,来看对应值是否相等。
此题的思想借用对称二叉树的性质。(即这颗树交换左右结点之后与原树相同)
class Solution:
def isSymmetric(self, root):
if not root:
return True
queque = [root]
queque1 = [root]#双枝
while (queque and queque1):
tmp = queque.pop(0)
tmp1 = queque1.pop(0)
# print(tmp.val)
# print('tmp1 %d' % tmp1.val)
if (tmp == None and tmp1 != None) or (tmp != None and tmp1 == None):
return False
if tmp == None and tmp1 == None:
continue
elif tmp.val != tmp1.val:
return False
if queque == None or queque1 == None:
return False
print(tmp)
print('tmp1, %d' % tmp1)
queque.append(tmp.left)
queque.append(tmp.right)
queque1.append(tmp1.right)
queque1.append(tmp1.left)
return True