101. 对称二叉树
题目描述:
给你一个二叉树的根节点 root , 检查它是否轴对称。
示例 1:
输入:root = [1,2,2,3,4,4,3]
输出:true
示例 2:
输入:root = [1,2,2,null,3,null,3]
输出:false
提示:
- 树中节点数目在范围 [1, 1000] 内
- -100 <= Node.val <= 100
进阶: 你可以运用递归和迭代两种方法解决这个问题吗?
解题分析及思路:
这道题考察的是二叉树的遍历,不熟悉二叉树的遍历可以查看二叉树。
方法:递归
如果一个树的左子树和右子树镜像对称,那么这个树是对称的。
因此,该问题可以转化为:两个树在什么情况下互为镜像?
如果同时满足下面的条件,两个树互为镜像:
- 它们的两个根结点具有相同的值
- 每个树的右子树都与另一个树的左子树镜像对称
- 同理,每个树的左子树都与另一个树的右子树镜像对称
这是一个递归的过程,我们可以通过递归的方式判断根节点的两个子树是否互为镜像。
func isSymmetric(root *TreeNode) bool {
if root == nil {
return true
}
return isMirror(root.Left, root.Right)
}
func isMirror(p, q *TreeNode) bool {
if (p == nil && q != nil) || (q == nil && p != nil) {
return false
}
if p == nil && q == nil {
return true
}
return p.Val == q.Val && isMirror(p.Right, q.Left) && isMirror(p.Left, q.Right)
}
复杂度:
- 时间复杂度:O(N),其中 N 是树中的节点个数
- 空间复杂度:O(1)
执行结果:
- 执行耗时:4 ms,击败了23.66% 的Go用户
- 内存消耗:2.6 MB,击败了20.79% 的Go用户