给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [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
说明:
如果你可以运用递归和迭代两种方法解决这个问题,会很加分。
第一次的代码:
递归:
def n(p,q):
if not p and not q:#同空
return True
if not p or not q:#有一个不空
return False
if p.val==q.val and n(p.left,q.right) and n(p.right,q.left):
#因为是镜像,因此是left=right来判断
return True
return False
if not root :
return True
return n(root.left,root.right)
56ms,排名88%
迭代:
if not root :#若为空树
return True
p,q=root.left,root.right
pl=[]#pl,ql记录节点
pv=[]#pv,qv记录节点的值
ql=[]
qv=[]
#当两子树节点以及两子树节点栈为空,表示无法继续迭代,遍历结束
while (p or pl) or (q or ql):
#不同是none,返回False
if not p and q or not q and p:
return False
if p:
pl.append(p)#非空节点入栈
p=p.left#向左迭代
else:#到达最左叶节点的左none
p=pl.pop()#此时p为最左叶节点
pv.append(p.val)#值入栈
p=p.right#向右节点迭代
if q:
ql.append(q)
q=q.right#p向左,q向右,保持镜像
else:
q=ql.pop()
qv.append(q.val)
q=q.left#注意左右
if qv!=pv:#知只要值不同,False
return False
return True
52ms,排名97%