请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。

例如,二叉树 [1,2,2,3,4,4,3] 是对称的。

    1
   / \
  2   2
 / \ / \
3  4 4  3

但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:

    1
   / \
  2   2
   \   \
   3    3

 

示例 1:

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

示例 2:

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

 

限制:

0 <= 节点个数 <= 1000

注意:本题与主站 101 题相同:https://leetcode-cn.com/problems/symmetric-tree/

Related Topics
  • 深度优先搜索
  • 广度优先搜索
  • 二叉树

  • 👍 305
  • 👎 0
  • 递归比较

    分析
    1. 左节点等于右节点
    2. 左节点的左子节点 == 右节点的右子节点
    3. 左节点的右子节点 == 右节点的左子节点
    4. 没有了
    代码
    class Solution {
        public boolean isSymmetric(TreeNode root) {
            //如果root==null 直接返回true,
            //否则比较root的左右节点是否相等
            
            return root==null || compare(root.left, root.right);
        }
    
        public boolean compare(TreeNode nodeL, TreeNode nodeR){
            //如果要比较的两个节点都是null 符合要求,且不用再往下比较了,直接返回true
            if (null == nodeL && null == nodeR){
                return true;
            }
            //进入到了这里的时候,不可能两个都是null了,如果有一个是null,则不是镜像的,返回false
            //如果两个节点都不是null,且两个的值不一样,也表名不是镜像的,返回false,不用再往下比较了
            if (nodeL == null || nodeR == null || nodeL.val != nodeR.val ){
                return false;
            }
            //继续对比两个节点的左右子节点是否对应相等
            //       左节点的左子节点 == 右节点的右子节点
            //且     左节点的右子节点 == 右节点的左子节点
            return compare(nodeL.left, nodeR.right) && compare( nodeL.right, nodeR.left);
        }
    }