剑指offer刷题笔记58(python)
题目描述
请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。
思路1
利用递归
代码1
class Solution:
def symmetrical(self
,left
,right
):
if left
== None and right
==None:
return True
if left
and right
:
return left
.val
== right
.val
and self
.symmetrical
(left
.right
,right
.left
) and self
.symmetrical
(left
.left
,right
.right
)
else:
return False
def isSymmetrical(self
, pRoot
):
if pRoot
== None:
return True
return self
.symmetrical
(pRoot
.left
,pRoot
.right
)
思路2
非递归,只需要维护一个栈即可,每次只比较一对节点。出栈的时候,相互比较的两个节点一块出栈来进行比较,有以下几种情况:
出栈的两个节点,都为空,继续(空节点也可以入栈,值为None)出栈的两个节点一个为空,一个不为空,返回False出栈的两个节点的值不相等,返回False 比较完这两个节点之后,需要将这两个节点的子节点入栈(即使子节点为空,也要入栈,值为None)。由于是检查对称二叉树,因此左右子节点要分别对应入栈,即p.left和q.right一块,p.right和q.left一块。 然后再进行下一次循环,若栈为空时,仍没有返回False,那么这颗二叉树就是对称,返回True
代码2
class Solution:
def isSymmetrical(self
, pRoot
):
if pRoot
== None:
return True
if pRoot
.left
== None and pRoot
.right
== None:
return True
p
= pRoot
.left
q
= pRoot
.right
stack
= [p
,q
]
while stack
:
p
= stack
.pop
()
q
= stack
.pop
()
if p
== None and q
== None:
continue
elif p
== None or q
== None:
return False
elif p
.val
!= q
.val
:
return False
else:
stack
.append
(p
.left
)
stack
.append
(q
.right
)
stack
.append
(p
.right
)
stack
.append
(q
.left
)
return True