1.题目
给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [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
进阶:
你可以运用递归和迭代两种方法解决这个问题吗?
2.思路
二叉树的定义:
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode() {
}
TreeNode(int val) {
this.val = val;
}
TreeNode(int val, TreeNode left, TreeNode right) {
this.val = val;
this.left = left;
this.right = right;
}
}
首先我们来思考递归的方法,递归的关键是要找到递归的那个点,首先我们还是来分析边缘条件
1、当root为null时,我们认为这是一颗对称二叉树,返回true
2、当root不为null,但是左树与右树都为null时,也是一颗对称二叉树,返回true
3、当root不为null,但是左树与右树其中一个为null或者左树的根节点与右树的根节点不相等,则不是一颗对称二叉树,返回false
4、然后我们来比较左树的左节点与右树的右节点、左树的右节点与右树的左节点是否想等(这里就是递归条件)
public boolean isSymmetric(TreeNode root) {
if(root == null){
return true;
}
return compare(root.left,root.right);
}
public boolean compare(TreeNode left,TreeNode right){
if (left == null && right == null){
return true;
}
if (left == null || right == null || left.val != right.val){
return false;
}
return compare(left.left,right.right) && compare(left.right,right.left);
}
后续补上用迭代的方法,这里对迭代的方法还不是很理解~
