老规矩,使用队列辅助完成广度优先遍历操作。
从根节点开始将左右孩子压入队列。
然后不停的从队列出去首2位元素(left,right)进行比较,
如相等,再将left节点的left节点与right节点的right节点。
这里有点绕人,需要结合图片理解
在比较完根节点的2个子孩子2和2后,根据镜像的性质,后续要比较的应该是
最左边的3和最右边的3,以此类推。
时间O(n)(每个元素都需要遍历一遍),空间O(n)(完全二叉树情况下叶子节点占n/2)
public boolean isSymmetric(TreeNode root) { if (root==null || (root.left==null && root.right==null)) return true; Deque<TreeNode> queue = new LinkedList<TreeNode>(); // 从根节点的左右孩子处开始比较 queue.add(root.left); queue.add(root.right); while(!queue.isEmpty()){ // 依次取出队首的2个元素(这里的left与right并不一定拥有同一个父节点) // 这里需要结合下文的add操作理解 TreeNode left = queue.poll(); TreeNode right = queue.poll(); // 左右孩子都为空,则直接进入一下次比较 if (left==null && right==null) continue; // 在上一次判断的基础上,左右孩子只有一个为空,必然存在左右孩子不等 if (left==null || right==null) return false; if (left.val!=right.val) return false; // 注意进入队列的顺序,由于题目要求的对称性质,所以要先将 // 最左边的元素与最右边的元素压入队列,然后是次左次右 queue.add(left.left); queue.add(right.right); queue.add(left.right); queue.add(right.left); } return true; }