# 对称二叉树

给你一个二叉树的根节点 root , 检查它是否轴对称。

示例 1:

img

输入:root = [1,2,2,3,4,4,3]
输出:true

示例 2:

img

输入:root = [1,2,2,null,3,null,3]
输出:false

提示:

  • 树中节点数目在范围 [1, 1000]
  • -100 <= Node.val <= 100

# 思路分析:

比如说 我给出一个 对称的二叉树如下图所示:

image-20240128114131089

那么怎么判断它到底是不是对称的呢?

首先根节点不用检查,我们让 根节点的 左右两个孩子去做比较,看看它俩的值是否一样,它俩值相等就表示至少从这两个节点开始它是对称的

image-20240128114317932

然后接着往下走,此时需要注意:

左边 2 节点的 左孩子 跟 右边 2 节点的 右孩子 进行对比,两个边上的对比一下

然后 左边 2 节点的 右孩子 跟 右边 2 节点 的 左孩子 进行对比

image-20240128114716085

接着往下比较也是类似的 比如说 比较到 3 节点了

image-20240128114812764

也是 左边 3 节点 的 左孩子 跟 右边 3 节点的 右孩子 进行比较

左边 3 节点的 右孩子 跟 右边 3 节点的 左孩子 进行比较

image-20240128114955109

# 代码实现:

class Solution {
    public boolean isSymmetric(TreeNode root) {
        //root 节点不用做比较 去比较 root 的 left 和 right 节点
        return check(root.left, root.right);
    }
    private boolean check(TreeNode left, TreeNode right) {
        // 如果 两边都是 null 说明也是一样的 
        if(left == null && right == null)
            return true;
        //left 和 right 不能同时为 null ,其中一个为 null 说明不对称
        if(right == null || left == null)
            return false;
        // 如果 左边的 值 和 右边的值不一样 说明不对称
        if(left.val != right.val)
            return false;
        // 1:判断 两边是否一样。2:判断内部两个是否一样
        return check(left.left, right.right) && check(left.right, right.left);
    }
}