从c++转向java后,用java写题是为了增加手感,毕竟java的集合类使用需要适应。
此题可以使用队列进行广度优先搜素:把root入队两遍,然后两个root出队,出队的时候对比root的左(右)孩子和另一个root的右(左)孩子是不是一样的值,是就入队孩子,不是就直接返回false。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public boolean isSymmetric(TreeNode root) {
Queue<TreeNode> q = new LinkedList<>();
if(root == null) {
return true;
}
q.add(root);
q.add(root);
while(q.size() > 0) {
//一次出队两个元素
TreeNode r1 = q.poll();
TreeNode r2 = q.poll();
//都为空,视为对称
if(r1 == null && r2 == null) {
continue;
}
//不对成
if(r1 == null && r2 != null) {
return false;
}
if(r1 != null && r2 == null) {
return false;
}
if(r1.val != r2. val){
return false;
}
//左(右)孩子和右(左)孩子成对入队
q.add(r1.left);
q.add(r2.right);
q.add(r1.right);
q.add(r2.left);
}
return true;
}
}