「这是我参与11月更文挑战的第20天,活动详情查看:2021最后一次更文挑战」
前言
力扣第一百零一题 对称二叉树 如下所示:
给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [1,2,2,3,4,4,3] 是对称的。
1 | markdown复制代码 1 |
但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:
1 | markdown复制代码 1 |
一、思路
题目中有一个关键信息:镜像对称。
那什么是镜像对称呢?就是指 根节点的左孩子 left 与右孩子 right相同,且 left.left == right.right 相同,left.right == right.left。如下图所示:
所以我们可以从根节点出发,到达根节点的左孩子 left 和右孩子 right,如果值相同则继续比对 left.left 是否与 right.right 相等,再比对 left.right 和 right.left 即可。
因为每一个节点都有可能是一个子树,所以我们这里使用递归是一个不错的选择,就不用手动去维护栈了。
在递归中我们要处理一些特殊的边界情况,如下所示:
- 如果根节点为空
null,则直接返回true即可。(空节点我们认为也是镜像对称的) - 如果
left == right == null,也可以返回true(两个空节点是相等的) - 如果
left和right中只有一个为空,此时返回false(很显然空节点不等于有值的节点)
举个例子
我们以下方的树作为例子:
- 对比根节点的左孩子,相等则继续向下
- 继续对比子树
left的左孩子和子树right的右孩子,发现5 != 3,则表示这个树不为镜像对称
- 找到结果后,直接返回
false即可
二、实现
实现代码
实现代码与思路中保持一致
1 | java复制代码 public boolean isSymmetric(TreeNode root) { |
测试代码
1 | java复制代码 public static void main(String[] args) { |
结果
三、总结
感谢看到最后,非常荣幸能够帮助到你~♥
如果你觉得我写的还不错的话,不妨给我点个赞吧!如有疑问,也可评论区见~
本文转载自: 掘金