给定一个二叉树,检查它是否是镜像对称的。
方法一
现有一棵树是对称二叉树:
![ac80b4f5c917e8d6725c903e7f4ef17b.png](https://i-blog.csdnimg.cn/blog_migrate/b706dcf7ac9e07fa3dda4a66005d61b4.jpeg)
首先我们对这棵树根节点的左子树进行前序遍历: pre_order = [2,3,5,6,4,7,8]
接着我们对这棵树根节点的右子树进行后序遍历:post_order = [8,7,4,6,5,3,2]
根据两次遍历我们不难发现 post_order 就是 pre_order的逆序,其实这也是对称二叉树的一个性质,根据这一点就不难写出代码了。
class Solution:
def isSymmetric(self, root: TreeNode) -> bool:
bli = [] # 用来存左子树的前序遍历
fli = [] # 用来存右子树的后序遍历
if root == None: # 无根节点
return True
if root and root.left == None and root.right == None: # 只有根节点
return True
if root and root.left and root.right:
self.pre_order(root.left, bli)
self.post_order(root.right, fli)
fli.reverse() # 将后序遍历的列表倒序
if bli == fli:
return True
else:
return False
def pre_order(self,root,li): # 二叉树的前序遍历
if root:
li.append(root.val)
self.pre_order(root.left,li)
self.pre_order(root.right,li)
elif root == None:
li.append(None)
def post_order(self,root,li): # 二叉树的后序遍历
if root:
self.post_order(root.left,li)
self.post_order(root.right,li)
li.append(root.val)
elif root == None:
li.append(None)
方法二: 递归
class Solution(object):
def isSymmetric(self, root):
def check(node1, node2):
if not node1 and not node2:
return True
elif not node1 or not node2:
return False
if node1.val != node2.val:
return False
return check(node1.left, node2.right) and check(node1.right, node2.left)
return check(root, root)
方法三: 迭代
其实就是层序遍历,然后检查每一层是不是回文数组
class Solution(object):
def isSymmetric(self, root):
queue = [root]
while queue:
next_queue = list()
layer = list()
for node in queue:
if not node:
layer.append(None)
continue
next_queue.append(node.left)
next_queue.append(node.right)
layer.append(node.val)
if layer != layer[::-1]:
return False
queue = next_queue
return True