101. 对称二叉树
给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [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
说明:
如果你可以运用递归和迭代两种方法解决这个问题,会很加分。
解题思路1:深度优先搜索。若二叉树为空,则返回True。递归判断左右孩子节点p,q的p.left和q.right,p.right和q.left节点对是否为对称的。
Python3代码如下:
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def isSymmetric(self, root):
"""
:type root: TreeNode
:rtype: bool
"""
if not root:
return True
return self.dfs(root.left,root.right)
def dfs(self,l,r):
if not l and not r:
return True
if not l:
return False
if not r:
return False
if l.val != r.val:
return False
return self.dfs(l.left,r.right) and self.dfs(l.right,r.left)
解题思路2:广度优先搜索。若二叉树为空,则返回True。使用栈stack来按层存储二叉树的节点。首先将根节点的左右子节点入栈进行栈的初始化,然后将栈底的两个节点出栈,比较两个节点是否相同,若不相同,直接返回False,若相同,则继续将左右两个节点p,q的p.left,q.right,p.right,q.left按次序进栈,之后继续对栈底两个节点出栈进行比较,循环此过程直到返回False或者栈空。
Python3代码如下:
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def isSymmetric(self, root):
"""
:type root: TreeNode
:rtype: bool
"""
if not root:
return True
stack = []
stack.append(root.left)
stack.append(root.right)
while stack:
p,q = stack.pop(0),stack.pop(0)
if not p and not q:
continue
elif not p or not q or p.val != q.val:
return False
stack.append(p.left)
stack.append(q.right)
stack.append(p.right)
stack.append(q.left)
return True