使用中序遍历,如果是对称的,遍历结果一定是对称的,且结点个数一定是奇数个,再排除根结点下左右子树值不相等的情况即可
class Solution:
def isSymmetrical(self , pRoot: TreeNode) -> bool:
#空树对称
if not pRoot:
return True
#有左右结点,但结点值不同,一定不对称
if pRoot.left and pRoot.right:
if pRoot.left.val != pRoot.right.val:
return False
#非递归中序遍历
stack = []
res = []
p = pRoot
while p or stack:
while p:
stack.append(p)
p = p.left
if not p:
p = stack.pop()
res.append(p.val)
p = p.right
n = len(res)
#偶数个结点一定不对称
if n%2 == 0:
return False
#看看中序遍历结果对不对称
for i in range(int(n/2)):
if res[i] != res[-1-i]:
return False
return True