Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).
For example, this binary tree [1,2,2,3,4,4,3]
is symmetric:
1
/ \
2 2
/ \ / \
3 4 4 3
But the following [1,2,2,null,3,null,3]
is not:
1
/ \
2 2
\ \
3 3
判断是否为对称的二叉树。我的第一思路比较简单,使用BFS方法,通过两个list,一个tempval存储当前层的val,一个tempnode存储当前层的节点。当节点为null时候,设val为-1.
class Solution:
def isSymmetric(self, root: TreeNode) -> bool:
if root is None:return True
bfs=[root]
while len(bfs)!=0:
tempval=[]
tempnode=[]
for node in bfs:
if node.left and node.right:
tempnode.append(node.left)
tempnode.append(node.right)
tempval.append(node.left.val)
tempval.append(node.right.val)
elif node.left:
tempnode.append(node.left)
tempval.append(node.left.val)
tempval.append(-1)
elif node.right:
tempnode.append(node.right)
tempval.append(-1)
tempval.append(node.right.val)
else:
tempval.append(-1)
if tempval!=tempval[::-1]:
return False
else:
bfs=tempnode
return True
然后看discuss中有一个步骤简单一些的BFS方法,根据node生成value,而不是直接建立存储val的list。
class Solution(object):
def isSymmetric(self, root):
if not root:
return True
queue = [root]
while queue:
value = [x.val if x else None for x in queue]
if value[::-1] != value:
return False
new_queue = []
for node in queue:
if node:
new_queue.append(node.left)
new_queue.append(node.right)
queue = new_queue
return True
当然还可以用递归的方法,这个代码更为简洁
def isSymmetric(self, root):
def isSym(L,R):
if L and R and L.val == R.val:
return isSym(L.left, R.right) and isSym(L.right, R.left)
return L == R
return not root or isSym(root.left, root.right)