剑指 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); }