一句话,题目很有趣!
当我看见这道题的时候,我就在想,这不就用一个层次遍历不就能够ac了嘛、于是我开始了我的幼稚想法!
public static boolean isSymmetric(TreeNode root) {
Queue<TreeNode> dui = new LinkedList<>();
int size = 0;
TreeNode p = null;
dui.offer(root);
while (!dui.isEmpty()) {
size = dui.size();
ArrayList<Integer> list = new ArrayList<>();
for (int i = 0; i < size; i++) {
p = dui.poll();
if (p.left != null) {
dui.offer(p.left);
}
if (p.right != null) {
dui.offer(p.right);
} else {
}
list.add(p.val);
}
int l = 0;
int r = list.size() - 1;
while (l < r) {
if (list.get(l++) != list.get(r--)) {
return false;
}
}
}
return true;
}
解释一下我的想法:
利用层次遍历获取每层的元素,然后存入集合,再用双指针进行判断头尾是否相等。
欸!想法很不错,提交就报错
很显然只要二叉树 其中有一个左节点和另一边的左节点相同,我这个方法也会认为它是一个对称的二叉树:
然后我就无语了。。。。尬住了
后面还是去看了别人的方法,果然大佬还是大佬,不是我这种幼稚的菜鸡能够比拟的,上代码!
private static boolean bfs(TreeNode left, TreeNode right) {
if (left == null && right != null) {
return false;
} else if (left != null && right == null) {
return false;
} else if (left == null && right == null) {
return true;
} else if (left.val != right.val) {
return false;
}
boolean out = bfs(left.left, right.right);
boolean in = bfs(left.right, right.left);
return out && in;
}
根据大佬的描述,先遍历外层二叉树,其次遍历内层。
条件为:
左、右节点但凡有一个不相同,则为false
以上条件都不满足时,就是左右节点相同,返回ture
是不是很厉害!果然我是菜狗~~