剑指 Offer 28. 对称的二叉树

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. 结语

  努力去爱周围的每一个人,付出,不一定有收获,但是不付出就一定没有收获! 给街头卖艺的人零钱,不和深夜还在摆摊的小贩讨价还价。愿我的博客对你有所帮助(*^▽^*)(*^▽^*)!

  如果客官喜欢小生的园子,记得关注小生哟,小生会持续更新(#^.^#)(#^.^#)。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2021-07-06 10:59  抚琴尘世客  阅读(37)  评论(0编辑  收藏  举报