题目:
请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。
思路一:
递归
代码:
写法一:(判断子节点)
class Solution:
def isSymmetrical(self, pRoot):
if not pRoot: return True
if pRoot.left and pRoot.right:
if pRoot.left.val != pRoot.right.val: return False
else: return self.helper(pRoot.left, pRoot.right)
if pRoot.left or pRoot.right: return False
return True
def helper(self, p1, p2):
if (not p1.left and p2.right) or (p1.left and not p2.right)\
or (not p1.right and p2.left) or (p1.right and not p2.left):
return False
if (p1.left and p2.right) and (not p1.right and not p2.left):
if p1.left.val == p2.right.val: return self.helper(p1.left, p2.right)
else: return False
if (p1.right and p2.left) and (not p1.left and not p2.right):
if p1.right.val == p2.left.val: return self.helper(p1.right, p2.left)
else: return False
if p1.left and p2.right and p1.right and p2.left:
if (p1.left.val != p2.right.val) or (p1.right.val != p2.left.val): return False
return self.helper(p1.left, p2.right) and self.helper(p1.right, p2.left)
return True
写法二:(判断父节点)
class Solution:
def isSymmetrical(self, pRoot):
if not pRoot: return True
return self.helper(pRoot.left, pRoot.right)
def helper(self, p1, p2):
if (not p1 and p2) or (p1 and not p2): return False
if not p1 and not p2: return True
if p1.val != p2.val: return False
return self.helper(p1.left, p2.right) and self.helper(p1.right, p2.left)
思路二:
DFS
代码:
class Solution:
def isSymmetrical(self, pRoot):
if not pRoot: return True
stack = []
stack.append(pRoot.left)
stack.append(pRoot.right)
while stack:
p1 = stack.pop()
p2 = stack.pop()
if (not p1 and p2) or (p1 and not p2): return False
if not p1 and not p2: continue
if p1.val != p2.val: return False
stack.append(p1.left)
stack.append(p2.right)
stack.append(p1.right)
stack.append(p2.left)
return True
思路三:
BFS(和思路二差不多)
代码:
class Solution:
def isSymmetrical(self, pRoot):
if not pRoot: return True
queue = []
queue.append(pRoot.left)
queue.append(pRoot.right)
while queue:
p1 = queue.pop(0)
p2 = queue.pop(0)
if (not p1 and p2) or (p1 and not p2): return False
if not p1 and not p2: continue
if p1.val != p2.val: return False
queue.append(p1.left)
queue.append(p2.right)
queue.append(p1.right)
queue.append(p2.left)
return True