image-20210901193616812.png

1.分析题目

判断二叉树是不是镜像对称的,首先要清楚我们比较的是什么,是左右两个节点吗?不是,应该是左右两个子树,为什么呢?一步一步来想,左子树的2和右子树的2比较,左子树的3和右子树上的3比较……如果我们只递归一个树的话,是不能同时得到左右两棵子树的节点信息的,因此我们要同时递归两棵子树,来进行比较

2.思路分析

  1. 确定递归函数的参数和返回值

参数:左右子树

返回值:boolean

  1. boolean compare(TreeNode left, TreeNode right)
  1. 确定终止条件

首先考虑节点为null的情况:

  • 两个对称的节点同为null,返回true
  • 两个对称的节点,只有其中一个为null,返回false
  1. if(left==null && right==null) return true;
  2. else if(left!=null && right==null) return false;
  3. else if(left==null && right!=null) return false;

节点都不为null的情况:

  • 两个对称的节点是不同的值,返回false
  • 两个对称的节点是相同的值,说明这两个节点符合,那就接着比较这两个节点下面的节点,直到终止
  1. if(left.val != right.val) return false;
  2. boolean outSide = compare(left.left, right.right);
  3. boolean inSide = compare(left.right, right.left);

3.代码

  1. class Solution {
  2. public boolean isSymmetric(TreeNode root) {
  3. if(root == null) return true;
  4. return compare(root.left, root.right);
  5. }
  6. boolean compare(TreeNode left, TreeNode right){
  7. if(left==null && right==null) return true;
  8. else if(left!=null && right==null) return false;
  9. else if(left==null && right!=null) return false;
  10. if(left.val != right.val) return false;
  11. boolean outSide = compare(left.left, right.right);
  12. boolean inSide = compare(left.right, right.left);
  13. boolean isSame = outSide && inSide;
  14. return isSame;
  15. }
  16. }