101. 对称二叉树
老规矩,使用队列辅助完成广度优先遍历操作。
从根节点开始将左右孩子压入队列。
然后不停的从队列出去首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; }
争取早日不再是一只菜鸡
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步