
1.分析题目
判断二叉树是不是镜像对称的,首先要清楚我们比较的是什么,是左右两个节点吗?不是,应该是左右两个子树,为什么呢?一步一步来想,左子树的2和右子树的2比较,左子树的3和右子树上的3比较……如果我们只递归一个树的话,是不能同时得到左右两棵子树的节点信息的,因此我们要同时递归两棵子树,来进行比较
2.思路分析
- 确定递归函数的参数和返回值
参数:左右子树
返回值:boolean
boolean compare(TreeNode left, TreeNode right)
- 确定终止条件
首先考虑节点为null的情况:
- 两个对称的节点同为
null,返回true - 两个对称的节点,只有其中一个为
null,返回false
if(left==null && right==null) return true;else if(left!=null && right==null) return false;else if(left==null && right!=null) return false;
节点都不为null的情况:
- 两个对称的节点是不同的值,返回
false - 两个对称的节点是相同的值,说明这两个节点符合,那就接着比较这两个节点下面的节点,直到终止
if(left.val != right.val) return false;boolean outSide = compare(left.left, right.right);boolean inSide = compare(left.right, right.left);
3.代码
class Solution {public boolean isSymmetric(TreeNode root) {if(root == null) return true;return compare(root.left, root.right);}boolean compare(TreeNode left, TreeNode right){if(left==null && right==null) return true;else if(left!=null && right==null) return false;else if(left==null && right!=null) return false;if(left.val != right.val) return false;boolean outSide = compare(left.left, right.right);boolean inSide = compare(left.right, right.left);boolean isSame = outSide && inSide;return isSame;}}
