题目描述
请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。
思路:1.首先根节点及其左右子树,树为空,True。
2.左孩子为空,判断右孩子是否为空。
3.左孩子不为空,右孩子为空,False。
4.左,右孩子均不为空,但值不同,False。
5.左,右孩子均不为空,值相同,递归 左子树的左子树和右子树的右子树值相同,左子树的右子树和右子树的左子树值相同。
# -*- coding:utf-8 -*-
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
class Solution:
def isSymetrical(self, pRoot):
if not pRoot:
return True
return self.comRoot(pRoot.left, pRoot.right)
def comRoot(self, l, r):
if not l:
return r ==None
if not r:
return False # 执行到这表示左孩子不为空
if l.val != r.val: # 左右子树均不为空,但值不同
return False
return self.comRoot(l.left, r.right) and self.comRoot(l.right, r.left)
或:
# -*- coding:utf-8 -*-
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def isSymmetrical(self,pRoot):
# write code here
return self.isSymBT(pRoot,pRoot) **# 把根节点和左右节点统一考虑**
def isSymBT(self,tree1,tree2): # 把根节点统一考虑
if tree1 == None and tree2 == None:
return True
if tree1 == None or tree2 == None:
return False
if tree1.val != tree2.val:
return False
return self.isSymBT(tree1.left,tree2.right) and self.isSymBT(tree1.right,tree2.left)
方法二:用stack或queue来存取各级子树根节点,DFS(深度优先)或BFS(广度优先)