LeetCode初级算法之树:101.对称二叉树
题目信息
给定一个二叉树,检查它是否是镜像对称的。
**示例1:**是对称的
1 | 1 |
**示例2:**不对称
1 | 1 |
解法一:递归
我们先来划分子问题,一个树对称也就最终根节点的左子树与右子树是对称的镜像的,那么要求左子节点与右子节点相等的同时左节点的左子树(右子树)与右节点的右子树(左子树)对称,还是画个图吧
我们传入这两颗树看是否对称,那么有三个操作:
- 第一两个根节点是否相等
- 第二它左子树是否与另外一个的右子树对称
- 第三它的右子树是否与另外一个的左子树对称
每次递归传递一对树,直到最后叶子只有节点节点比较
1 | public boolean isSymmetric(TreeNode root) { |
遍历了整颗树时间复杂度为O(n),递归系统栈占用大小取决于树的层度这里不是完全二叉树所以它只是小于n空间复杂度为O(n)
方法二:迭代
递归思路写完了,栈换成队列使用广度的方式完成同样的思路,还是再画个图
通过队列依次按照顺序比较offer进队列时就是一个树的左(右)与另一个树的右(左),poll出队列的两个也就是对应的,直到对队列没有后续进来的为空了仍然没出现不满足情况的,则是对称二叉树
1 | public boolean isSymmetric(TreeNode root) { |
时间复杂度与空间复杂度同上
总结
无外乎深度优先与广度优先,上面的两种解都是优的解在一次树的遍历过程中完成对是否是对称的判断。如果直接暴力的还可先遍历一遍得到序列或者数组再判断,比如先序遍历与后序遍历序列相反,比如中序遍历结果是回文的,总之我们要先对遍历熟悉。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 木瓜煲鸡脚's blog!
评论