1. 题目
请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。
例如,二叉树 [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
2. 示例
示例1
输入:root = [1,2,2,3,4,4,3]
输出:true
示例2
输入:root = [1,2,2,null,3,null,3]
输出:false
3. 题解
此题其实跟剑指Offer26 树的结构类似的解法。
此处采用的是左右查对比:
- 一个查找从左边开始,一个查找从右边开始
- 判段左开始的左子树是否等于右开始的右子树,左开始的右子树是否等于右开始的左子树。将其都的当成根节点的话,只需要判断根节点是否相等,然后递归的时候加入左右对比。
-
if(A.val == B.val) { return isEqual(A.left, B.right) && isEqual(A.right, B.left); } else { return false; }
4. 实现
1 public class IsSymmetric28 {
2 // 队列
3 // 此题跟剑指 Offer 26. 树的子结构类似
4 public boolean isSymmetric(TreeNode root) {
5 // 空节点,返回true
6 if(root == null) return true;
7 // 左右分别查找对比
8 return isEqual(root.left, root.right);
9 }
10 public boolean isEqual(TreeNode A, TreeNode B) {
11 // 如果两个都为Null,说明找到子节点都相同
12 if(A == null && B == null) return true;
13 // 存在其中一个为null,说明不对称
14 if(A == null || B == null) return false;
15 // 如果相等
16 if(A.val == B.val) {
17 // 左右查找对比
18 return isEqual(A.left, B.right) && isEqual(A.right, B.left);
19 } else {
20 // 不等返回false
21 return false;
22 }
23 }
24 }
5. 结语
努力去爱周围的每一个人,付出,不一定有收获,但是不付出就一定没有收获! 给街头卖艺的人零钱,不和深夜还在摆摊的小贩讨价还价。愿我的博客对你有所帮助(*^▽^*)(*^▽^*)!
如果客官喜欢小生的园子,记得关注小生哟,小生会持续更新(#^.^#)(#^.^#)。