22对称二叉树
2020-08-06 本文已影响0人
Jachin111
给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [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
首先我们对这棵树根节点的左子树进行前序遍历: 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:
def isSymmetric(self, root: TreeNode) -> bool:
def help(left, right):
# left/right都为空节点
if not left and not right:
return True
# left/right有一个为空
if not (left and right):
return False
# 值是否相等
if left.val != right.val:
return False
# 将左右字节对称递归比较
return help(left.left, right.right) and help(left.right, right.left)
return help(root.left, root.right) if root else True
迭代
from collections import deque
class Solution:
def isSymmetric(self, root: TreeNode) -> bool:
deq = deque([root, root])
while deq:
t1, t2 = deq.pop(), deq.pop()
# 两个节点都为空, 则继续判断
if not t1 and not t2: continue
# 存在一个节点为空, 则为False
if not(t1 and t2): return False
if t1.val != t2.val: return False
# t1, t2的左右节点, 要对称的写入双端队列中
deq.append(t1.left)
deq.append(t2.right)
deq.append(t1.right)
deq.append(t2.left)
return True
BFS
BFS 使用一个队列,很多题解中的 BFS 都是放入了四次节点,一种更直观的做法是两两一组放入队列中。
在队列中同时取出两个节点left, right,判断这两个节点的值是否相等,然后把他们的孩子中按照(left.left, right.right) 一组,(left.right, right.left)一组放入队列中。
BFS做法需要把所有的节点都检查完才能确定返回结果True,除非提前遇到不同的节点值而终止返回False。
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
来源:力扣(LeetCode)