LeetCode39 - 对称二叉树
📝 题目描述
题目链接:对称二叉树
给你一个二叉树的根节点 root, 检查它是否轴对称。
示例:
示例 1:
1 | 输入:root = [1,2,2,3,4,4,3] |
示例 2:
1 | 输入:root = [1,2,2,null,3,null,3] |
提示:
树中节点数目在范围 [1, 1000] 内-100 <= Node.val <= 100
💡 解题思路
方法一:递归
判断一棵树是否对称,本质上是判断它的左子树和右子树是否是相互镜像的。
如果同时满足下面的条件,两个树互为镜像:
- 它们的两个根结点具有相同的值
- 每个树的右子树都与另一个树的左子树镜像对称
我们可以实现这样一个递归函数,通过“同步移动”两个指针的方法来遍历这棵树。
首先获取根节点的左节点指针 left 和右节点指针 right,然后进入函数,首先比较这两个指针是否相同,然后left->left和right->right进行比较,left->right和right->left进行比较。即这两个指针移动方向相反,随后 left 左移时,right 右移;left 右移时,right 左移。每次检查当前 left 和 right 节点的值是否相等,如果相等再判断左右子树是否对称。
方法二:迭代
首先我们引入一个队列,这是把递归程序改写成迭代程序的常用方法。
初始化时我们把根节点的两个子节点入队,循环中每次提取两个结点并比较它们的值(队列中每两个连续的结点应该是相等的,而且它们的子树互为镜像),然后将两个结点的左右子结点按相反的顺序插入队列中。当队列为空时,或者我们检测到树不对称(即从队列中取出两个不相等的连续结点)时,该算法结束。
🔧 代码实现
1、递归
1 | class Solution { |
2、迭代
1 | class Solution { |
📊 复杂度分析
1、暴力解法
- 时间复杂度:,这里遍历了整棵树。
- 空间复杂度:,其中 H 为树的高度。这是由于递归调用栈的开销。最坏情况下(树退化成链表)为 ,而在平衡二叉树下为 。
2、优化解法
- 时间复杂度:,这里遍历了整棵树。
- 空间复杂度:,这里需要用一个队列来维护节点,每个节点最多进队一次,出队一次,队列中最多不会超过 n 个点。
🎯 总结
- 核心思想:记住镜像移动的方法。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 很多时候不懂事!