2020-05-31 LeetCode 101 对称二叉树 C++

题目:

 给定一个二叉树,检查它是否是镜像对称的。

 例如,二叉树 [1,2,2,3,4,4,3] 是对称的。

示例:

    1
   / \
  2   2
 / \ / \
3  4 4  3

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

    1
   / \
  2   2
   \   \
   3    3

进阶:

 你可以运用递归和迭代两种方法解决这个问题吗?

 题目比较简单,尤其是递归,对于对称的两个节点t1,t2主要需要比较三个值:t1与t2节点的val,t1子左节点和t2子右节点、t1子右节点和t2子左节点,还需判断NULL的特殊情况,实现代码如下

class Solution {
public:
    bool isEqual(TreeNode* l,TreeNode* r){
        if(r==NULL&&l==NULL)
            return true;
        else if(r==NULL||l==NULL)
            return false;
        else
            return (l->val==r->val)&&isEqual(l->left,r->right)&&isEqual(l->right,r->left);
    }

    bool isSymmetric(TreeNode* root) {
        if(root==NULL)
            return true;
        return isEqual(root->left,root->right);
    }
};

运行结果:

 不是很稳定,0 4 8ms都有,看了下大家代码都差不多,没有只是代码风格不同而已

在这里插入图片描述

 迭代的方法需要动态维护,之前写中序遍历用的队列,这里就没多想,只需要注意插入队列时要对称插入,实现代码如下:

class Solution {
public:
    bool isSymmetric(TreeNode* root) {
        if(root==NULL)
            return true;
        queue<TreeNode*> q;
        q.push(root->left);
        q.push(root->right);
        while(!q.empty()){
            TreeNode* t1=q.front();
            q.pop();
            TreeNode* t2=q.front();
            q.pop();
            if(!t1&&!t2)  
                continue;
            else if(!t1||!t2)
                return false;
            else if(t1->val!=t2->val)
                return false;
             //对称插入
            q.push(t1->left);
            q.push(t2->right);
            q.push(t1->right);
            q.push(t2->left);
        }
        return true;
    }
};

运行结果:

在这里插入图片描述

 官方的实现默认插入两个root,感觉平凡无故的增加了计算量,没必要。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章