算法15.对称的二叉树


题目描述

请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。

示例 1:

二叉树 [1,2,2,3,4,4,3] 是对称的。
    1
   / \
  2   2
 / \ / \
3  4 4  3

示例 2:

但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:
    1
   / \
  2   2
   \   \
   3    3

解题思路

方法一:递归分析

时间复杂度:$O(N)$

空间复杂度:$O(N)$

代码如下

class Solution {
public:
    bool isSymmetric(TreeNode* root) {
        if(root==NULL)  return true;
        return isSymmetricHelper(root->left, root->right);
    }
    bool isSymmetricHelper(TreeNode *left, TreeNode *right){
        if(left==NULL && right==NULL)   return true;
        if( left==NULL || right==NULL || left->val!=right->val )  return false;
        return  isSymmetricHelper(left->right,right->left) && isSymmetricHelper(left->left, right->right);
    }
};

解法分析

每一次递归传进左子树指针和右子树指针。终止条件为下面几种情况:

  1. 左右子树都为空,返回$True$
  2. 左右子树值不等或者只有一边为空,返回$False$
  3. 返回递归函数,函数参数是左子树的左子树和右子树的右子树比较;与左子树的右子树和右子树的左子树比较。
方法二:辅助栈方法

时间复杂度:$O(N)$

空间复杂度:$O(N)$

代码如下

//摘自LeetCode中sdwwld大佬
public boolean isSymmetric(TreeNode root) {
    //队列
    Queue<TreeNode> queue = new LinkedList<>();
    if (root == null)
        return true;
    //左子节点和右子节点同时入队
    queue.add(root.left);
    queue.add(root.right);
    //如果队列不为空就继续循环
    while (!queue.isEmpty()) {
        //每两个出队
        TreeNode left = queue.poll(), right = queue.poll();
        //如果都为空继续循环
        if (left == null && right == null)
            continue;
        //如果一个为空一个不为空,说明不是对称的,直接返回false
        if (left == null ^ right == null)
            return false;
        //如果这两个值不相同,也不是对称的,直接返回false
        if (left.val != right.val)
            return false;
        //这里要记住入队的顺序,他会每两个两个的出队。
        //左子节点的左子节点和右子节点的右子节点同时
        //入队,因为他俩会同时比较。
        //左子节点的右子节点和右子节点的左子节点同时入队,
        //因为他俩会同时比较
        queue.add(left.left);
        queue.add(right.right);
        queue.add(left.right);
        queue.add(right.left);
    }
    return true;
}

解法分析

解法分析看上面代码注释


文章作者: ray
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 ray !
评论
 上一篇
虚拟机集群分布的两三坑... 虚拟机集群分布的两三坑...
​ 配环境永远是世界性难题之一。最近开始踩大数据的坑,为了实现HDFS完全集群分布实验,我克隆了三台虚拟机作为我的实验对象。在经历了连接校园网虚拟机分不到内网IP的漫长难题之后,本以为终于可以顺顺利利实验,结果还是遇到了不少b
2020-11-03
下一篇 
算法14.树的子结构 算法14.树的子结构
题目描述输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构) B是A的子结构, 即 A中有出现和B相同的结构和节点值。 示例 1: 给定的树 A: 3 / \ 4 5 / \
2020-10-27
  目录