请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。
例如,二叉树 [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
输入:root = [1,2,2,3,4,4,3] 输出:true
输入: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);
}