「这是我参与11月更文挑战的第20天,活动详情查看:2021最后一次更文挑战」
前言
力扣第一百零一题 对称二叉树
如下所示:
给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [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
复制代码
一、思路
题目中有一个关键信息:镜像对称。
那什么是镜像对称呢?就是指 根节点的左孩子 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
即可
二、实现
实现代码
实现代码与思路中保持一致
public boolean isSymmetric(TreeNode root) {
if(root == null)
return true;
return dfs(root.left, root.right);
}
public boolean dfs(TreeNode left, TreeNode right) {
if (left == null && right == null)
return true;
else if (left == null || right == null)
return false;
else if (left.val != right.val)
return false;
return dfs(left.left, right.right) && dfs(left.right, right.left);
}
复制代码
测试代码
public static void main(String[] args) {
TreeNode treeNode = new TreeNode(1,
new TreeNode(2, new TreeNode(3), new TreeNode(4)),
new TreeNode(2, new TreeNode(4), new TreeNode(3)));
boolean flag = new Number101().isSymmetric(treeNode);
System.out.println(flag);
}
复制代码
结果
三、总结
感谢看到最后,非常荣幸能够帮助到你~♥
如果你觉得我写的还不错的话,不妨给我点个赞吧!如有疑问,也可评论区见~