题目描述
给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [1,2,2,3,4,4,3] 是对称的。
但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的。
思路
首先思考,如何判定一棵树是否对称?
先从简单的情况开始考虑
上面这颗树的左、右子节点相等,明显是一颗对称树
随着树结构的复杂,我们应如何去辨别一棵树是否对称呢
观察上面这颗树,我们从根节点出发,如果递归地判断左子树和右子树是对称的,那么我们可以说这棵树是对称的
现在我们从简单的情况推广到复杂的情况
然后对复杂的情况进行分解,由一个大问题(递归地)分解成更小的子问题,然后子问题不断收敛至最简单情况
那么最简单情况有哪些?
- 如果当前根节点为null,说明为空树,一定是对称的,返回true
- 如果当前只有根节点,返回true
- 如果当前节点只有一个子节点,一定为非对称,返回false
java代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public boolean isSymmetric(TreeNode root) {
if(root == null) return true;
else return isSymmetric(root.left, root.right);
}
private boolean isSymmetric(TreeNode left, TreeNode right){
if(left == null && right == null)
return true;
else if((left !=null && right==null) || (right!=null && left==null))
return false;
else if(left.val != right.val)
return false;
else{
return isSymmetric(left.left, right.right) && isSymmetric(left.right, right.left);
}
}
}
写在最后
本题用到了递归算法,这里就需要谈一谈了
确实递归算法非常有用,描述简单直观,但是往往很多人就是一看就会,一写就完
那么应该如何提升对于递归的理解?
其实对于本题来说,就是应该如何递归?或者说,如何找到更小规模的问题
对于一棵树而言,如果它的左子树和右子树是对称的,那么这颗树就一定是对称的
我们这时候就观察出一个更小规模的问题:判断根节点的左子树和右子树是否对称
而左(右)子树又可以单独地看成一棵树,这就陷入了递归的过程
递归的思维确实需要不断地训练
不断训练抽象思维能力,不断提高分解问题的能力