import java.util.*;
/*
* public class TreeNode {
* int val = 0;
* TreeNode left = null;
* TreeNode right = null;
* public TreeNode(int val) {
* this.val = val;
* }
* }
*/
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param pRoot TreeNode类
* @return bool布尔型
*/
public boolean isSymmetrical (TreeNode pRoot) {
// write code here
// 思路1:
// 判断二叉数是否对称,可以通过层序遍历,
// 然后看每层的元素是否满足 get(i) == get(length-i-1)
// ArrayList<ArrayList<Integer>> arrayList = new ArrayList<>();
// Queue<TreeNode> queue = new LinkedList<>();
// queue.offer(pRoot);
// while (!queue.isEmpty()) {
// ArrayList<Integer> list = new ArrayList<>();
// arrayList.add(list);
// int size = queue.size();
// for (int i = 0; i < size; i++) {
// TreeNode node = queue.poll();
// if (node == null) {
// list.add(0);
// continue;
// }
// list.add(node.val);
// queue.offer(node.left);
// queue.offer(node.right);
// }
// }
// for (int j = 0; j < arrayList.size(); j++) {
// List<Integer> h = arrayList.get(j);
// for (int c = 0; c < h.size() / 2; c++) {
// if (!Objects.equals(h.get(c), h.get( h.size() - c - 1))) {
// return false;
// }
// }
// }
// return true;
// 思路2:
// 如果一个树是对称二叉树,那必定存在根节点的左子树等于右子树
// 左节点的 左子树等于右节点的右子树,左节点的右子树等于右节点的左子树
return duiChen( pRoot, pRoot);
}
private boolean duiChen(TreeNode n1, TreeNode n2) {
if (n1 == null && n2 == null) {
return true;
}
if (n1 == null || n2 == null || n1.val != n2.val) {
return false;
}
return duiChen(n1.left, n2.right) && duiChen(n1.right, n2.left);
}
}