描述
给定一棵二叉树,判断其是否是自身的镜像(即:是否对称)
例如: 下面这棵二叉树是对称的
下面这棵二叉树不对称。
数据范围:节点数满足 0≤�≤10000≤n≤1000,节点上的值满足 ∣���∣≤1000∣val∣≤1000
要求:空间复杂度 �(�)O(n),时间复杂度 �(�)O(n)
备注:
你可以用递归和迭代两种方法解决这个问题
题源:对称的二叉树_牛客题霸_牛客网 (nowcoder.com)
示例1
输入:
{1,2,2,3,4,4,3}
复制
返回值:
true
复制
示例2
输入:
{8,6,9,5,7,7,5}
复制
返回值:
false
思路:
前序遍历的时候我们采用的是“根左右”的遍历次序,如果这棵二叉树是对称的,即相应的左右节点交换位置完全没有问题,那我们是不是可以尝试“根右左”遍历,按照轴对称图像的性质,这两种次序的遍历结果应该是一样的。
不同的方式遍历两次,将结果拿出来比较看起来是一种可行的方法,但也仅仅可行,太过于麻烦。我们不如在遍历的过程就结果比较了。而遍历方式依据前序递归可以使用递归:
- 终止条件: 当进入子问题的两个节点都为空,说明都到了叶子节点,且是同步的,因此结束本次子问题,返回true;当进入子问题的两个节点只有一个为空,或是元素值不相等,说明这里的对称不匹配,同样结束本次子问题,返回false。
- 返回值: 每一级将子问题是否匹配的结果往上传递。
- 本级任务: 每个子问题,需要按照上述思路,“根左右”走左边的时候“根右左”走右边,“根左右”走右边的时候“根右左”走左边,一起进入子问题,需要两边都是匹配才能对称。
public boolean isSymmetrical(TreeNode root){
return text(root,root);
}
public static boolean text (TreeNode root1,TreeNode root2) {
if (root1 == null && root2 == null)return true;
if (root1 == null || root2 == null || root1.val != root2.val)return false;
return text(root1.left,root2.right) && text(root1.right,root2.left);
}
- 时间复杂度:O(n),其中�n为二叉树的节点数,相当于遍历整个二叉树两次。
- 空间复杂度:O(n),最坏情况二叉树退化为链表,递归栈深度为�n。