1. 题目分析
这是一道很经典的二叉树的问题,首先我们分析一下这道题,这道题的题意应该是很明显的,那么我们要怎么来检查是否是对称二叉树呢?
仔细分析一下,根节点其实对我们的求解没有太大的影响,我们只需要分析数的左右子树是否对称就行了。
- 基本思想:
- 我们可以用镜像对称的遍历方式来遍历这两个二叉树,说到这里,相信已经有了一些想法了。
就拿这张图来说,去掉根节点,对于左子树,我们的遍历方式是,根,左,右
对于右子树,我们的遍历方式是,根,右,左,我们来写详细一点
左子树:根,左,右
数据: 2,3,4
右子树:根,右,左
数据:2,3,4
依次比较遍历到的数据,这样就能说明这个树是镜像对称的
- 基于以上的思想,我们很容易联想到了递归,因为递归是解决二叉树遍历问题的基本算法。
- 不过根据我的经验,任何的递归算法,都能用栈或者队列的方式华为非递归迭代的方法,所以这道题我们用递归和非递归两种方法解决。
- 递归算法大家已经很清楚了,但是非递归算法我们就要用到队列了。
- 给出图解
2. 代码实现
2.1. 递归算法
2.1.1. Python代码
class Solution(object):
def isSymmetric(self, root):
"""
:type root: TreeNode
:rtype: bool
"""
def rec(left,right):
if(left == None and right != None):
return False
if(right == None and left != None):
return False
if(left == None and right == None):
return True
if(left.value != right.value):
return False
return rec(left.left,right.right) and rec(left.right,right.left)
return flag
2.1.2. Java代码
public class IsSymmetric {
public boolean isSymmetric(TreeNode root) {
return rec(root.left,root.right);
}
public boolean rec(TreeNode left,TreeNode right){
if((left == null && right != null) || (left != null && right == null)){
return false;
}else if(left == null && right == null){
return true;
}else{
if(left.val != right.val){
return false;
}
}
return rec(left.left,right.right) && rec(left.right,right.left);
}
}
2.2. 非递归算法
Python代码
class Solution(object):
def isSymmetric(self, root):
"""
:type root: TreeNode
:rtype: bool
"""
queue = []
left = root.left
right = root.right
if(left and right):
queue.append(left)
queue.append(right)
if(left != None and right == None) or (left == None and right != None):
return False
while len(queue) != 0:
if(len(queue)%2 == 0):
target1 = queue.pop(0)
target2 = queue.pop(0)
if (target1 != None and target2 == None) or (target1 == None and target2 != None):
return False
if target1 != None and target2 != None:
if(target1.val != target2.val):
return False
queue.append(target1.left)
queue.append(target2.right)
queue.append(target1.right)
queue.append(target2.left)
else:
return False
return True