题目描述:给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [1,2,2,3,4,4,3] 是对称的。
1 | 1 |
但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:
1 | 1 |
进阶:你可以运用递归和迭代两种方法解决这个问题吗?
1 | /** |
方法一:递归
根据题目的描述,镜像对称,就是左右两边相等,也就是左子树和右子树是相当的。我们将根节点的左子树记做 p
,右子树记做 q
。比较 p
是否等于 q
,不等的话直接返回就可以了。如果相当,比较 p
的左节点和 q
的右节点,再比较 p
的右节点和 q
的左节点
根据上面信息可以总结出递归函数的两个终止条件:
p
和q
不等、p
和q
都为空、p
和q
有一个为空- 递归比较
p
的left
和right
,递归比较q
的left
和right
1 | class Solution { |
复杂度分析:
- 时间复杂度:这里遍历了这棵树,渐进时间复杂度为 O(n)
- 空间复杂度:这里的空间复杂度和递归使用的栈空间有关,这里递归层数不超过 h,故渐进空间复杂度为 O(h)
执行结果:通过
执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户
内存消耗:38.1 MB, 在所有 Java 提交中击败了41.89%的用户
方法二:遍历
递归程序改写成迭代程序的常用方法:引入队列
思路如下:
- 首先从队列中拿出两个节点(
p
和q
)比较 - 将
p
的left
节点和q
的right
节点放入队列 - 将
p
的right
节点和q
的left
节点放入队列
1 | class Solution { |
复杂度分析:
- 时间复杂度:O(n),同「方法一」
- 空间复杂度:这里需要用一个队列来维护节点,每个节点最多进队一次,出队一次,队列中最多不会超过 n 个点,故渐进空间复杂度为 O(n)
执行结果:通过
执行用时:1 ms, 在所有 Java 提交中击败了29.33%的用户
内存消耗:39.3 MB, 在所有 Java 提交中击败了12.87%的用户