【OJ】LeetCode——101.对称二叉树

题目描述

给定一个二叉树,检查它是否是镜像对称的。

例如,二叉树 [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);
        }
    }
}

写在最后

本题用到了递归算法,这里就需要谈一谈了
确实递归算法非常有用,描述简单直观,但是往往很多人就是一看就会,一写就完
那么应该如何提升对于递归的理解?
其实对于本题来说,就是应该如何递归?或者说,如何找到更小规模的问题
对于一棵树而言,如果它的左子树和右子树是对称的,那么这颗树就一定是对称的

我们这时候就观察出一个更小规模的问题:判断根节点的左子树和右子树是否对称
而左(右)子树又可以单独地看成一棵树,这就陷入了递归的过程

递归的思维确实需要不断地训练
不断训练抽象思维能力,不断提高分解问题的能力

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值