LeetCode 剑指 Offer 28. 对称的二叉树

时间:2022-07-22
本文章向大家介绍LeetCode 剑指 Offer 28. 对称的二叉树,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

剑指 Offer 28. 对称的二叉树

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

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

解题

package tree.二叉树的镜像;


import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;

/**
 * @Auther: truedei
 * @Date: 2020 /20-6-10
 * @Description: 二叉树镜像
 */
public class Solution {

    static public boolean isSymmetric(TreeNode root) {

        //根节点为null时,返回true,说明是
        return root == null?true:check(root.left,root.right);
    }

    private static boolean check(TreeNode left, TreeNode right) {
        if(left == null && right==null)
            return true;
        if(left==null || right==null || left.val != right.val)
            return false;

        return check(left.left,right.right) && check(left.right,right.left);
    }

    public static void main(String[] args) {
        TreeNode t1 = new TreeNode(1);
        TreeNode t2 = new TreeNode(2);
        TreeNode t3 = new TreeNode(2);
        TreeNode t4 = new TreeNode(3);
        TreeNode t5 = new TreeNode(4);
        TreeNode t6 = new TreeNode(4);
        TreeNode t7 = new TreeNode(3);


        t1.left=t2;
        t1.right=t3;

        t2.left=t4;
        t2.right=t5;

        t3.left=t6;
        t3.right=t7;

        boolean bool = isSymmetric(t1);
        System.out.println(bool);

    }
}

class TreeNode {
    int val;//每个节点存放的数据
    TreeNode left;//左节点
    TreeNode right;//右节点
    TreeNode(int x) { val = x; }
}

核心代码:

static public boolean isSymmetric(TreeNode root) {
	//如果传过来的是null,则返回true,否则就去检查左右节点
    return root == null?true:check(root.left,root.right);
}

//负责递归检查左右节点
private static boolean check(TreeNode left, TreeNode right) {
	//如果左右都为null,说明该二叉树也是对称的
    if(left == null && right==null)
        return true;
    //如果缺少左右子节点的某一个,或者不相等,那就不是一颗对称二叉树
    if(left==null || right==null || left.val != right.val)
        return false;
	//否则就检查,该二叉树的左节点的左和右节点的右;和检查另外两个
	//如果都是true,说明对称
    return check(left.left,right.right) && check(left.right,right.left);
}