描述
给定一棵二叉树,判断其是否是自身的镜像(即:是否对称)
例如:下面这棵二叉树是对称的
1
/ \
2 2
/ \ / \
3 4 4 3
下面这棵二叉树不对称。
1
/ \
2 2
\ \
3 3
备注:
希望你可以用递归和迭代两种方法解决这个问题
示例1
输入:
{1,2,2}
复制返回值:
true
因为要比较左右结点是否对称,因此可以通过BFS每次对一层的结点进行遍历并比较是否对称。
对于树的问题,往往还可以通过递归解决,相对于遍历,代码量会少很多,但没有遍历容易理解。
方法一:BFS
图解
算法流程:
-
1、每次往队列中按顺序,从左到右放入当前结点的左右子节点,随后进行判断。
2、每次从Queue中获取前两个元素,并比较值
3、如果又一对元素比较结果不相等,则表示不对称。
4、注意放入队列的顺序,左子结点的左子结点、右子结点的右子结点、左结点的右子结点、右结点的左子结点放入队列。
Java 版本代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
|
复杂度分析:
时间复杂度 O(N):对每一层的左右对称两个结点都要进行比较
空间复杂度 O(N):需要借助队列实现BFS
方法二:递归
对于递归方法,最重要的是能清晰地定义递归函数的功能并实现,而且只需要在调用递归函数的时候直接使用该功能即可,不能跳入递归逻辑当中,只需要认准 ”调用即实现“ 即可。
算法流程:
- 构建递归函数:
- 定义函数功能:判断左右两个结点是否对称相等
- 递归终止条件:
- 没有子节点,说明当前结点是叶子结点
- 没有右子节点(因为是按从左到右的顺序比较的)
- 左右结点不对称
Java 版本代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
|