Day30:对称的二叉树

139 阅读2分钟

描述

给定一棵二叉树,判断其是否是自身的镜像(即:是否对称)
例如:                                 下面这棵二叉树是对称的

下面这棵二叉树不对称。

数据范围:节点数满足 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。