领扣(LeetCode)对称二叉树 个人题解
给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [1,2,2,3,4,4,3]
是对称的。
1 / \ 2 2 / \ / \ 3 4 4 3
但是下面这个 [1,2,2,null,3,null,3]
则不是镜像对称的:
1 / \ 2 2 \ \ 3 3
说明:
如果你可以运用递归和迭代两种方法解决这个问题,会很加分。
(算法萌新,轻拍求指点 XD 此题思路参考了官方题解。)
由于是很久没有接触这种类型的题目了,所以第一次拿到有点懵。还是看了题解才找回感觉。
看这个二叉树是不是对称的,主要是看二叉树左边和右边的节点是不是各自相反。每一层都是左右颠倒。
所以通过递归,判断左树和右树相反的节点的值是不是相同。
如果两边都为空,正常退出,说明递归到树的底部了。
如果有一边空了另外一半没空,说明有一边的节点没了,另外一半还在,肯定不是对称的树
如果两边对称,继续递归节点的左右节点,直到递归完全或者发现不对称。
代码如下:
递归:
1 class Solution { 2 public boolean isSymmetric(TreeNode root) { 3 return isMirror(root, root); 4 } 5 6 boolean isMirror(TreeNode t1, TreeNode t2) 7 { 8 if (t1 == null && t2 == null) 9 return true; 10 if(t1 == null ||t2==null) 11 return false; 12 if(t1.val==t2.val) 13 { 14 return true && isMirror(t1.right, t2.left) && isMirror(t1.left, t2.right); 15 } 16 return false; 17 } 18 19 }
第二种方法是迭代,虽然知道做法和用意,但是在使用上不够熟练。大概思路就是把待处理的节点入队,然后依次出队处理,获取新的待处理节点入队。
在处理时出现了一个问题,在迭代时遇到两个都为空的节点不能直接退出循环,虽然可能是二叉树的底部,但是因为这时队列里可能还有其他未处理的节点等待处理,不能直接返回。
代码如下:
迭代:
1 class Solution { 2 3 4 public boolean isSymmetric(TreeNode root) 5 { 6 Queue<TreeNode> queue=new LinkedList<TreeNode>(); 7 queue.add(root); 8 queue.add(root); 9 while(!queue.isEmpty()) 10 { 11 TreeNode t1=queue.poll(); 12 TreeNode t2=queue.poll(); 13 if(t1==null && t2==null) 14 continue; 15 if(t1==null || t2==null) 16 { 17 return false; 18 } 19 if(t1.val!=t2.val) 20 return false; 21 queue.add(t1.left); 22 queue.add(t2.right); 23 queue.add(t1.right); 24 queue.add(t2.left); 25 26 } 27 return true; 28 } 29 }