Leetcode题目解析(191122):101&102&104

Leetcode 101:对称二叉树

题目描述

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

解题思路

既然它是镜像的话,那么就是左右对称,这个我们可以使用一个递归来解决。我们令A等于这个树,B也等于这个树,假设A树和B树都只有一个结点(空结点也看做是一个结点)其实也就是两个树中至少一个树为NULL的时候,结果只会存在三种情况:
1.A的该结点为NULL,B的该结点也为NULL,即都是空结点,那么这两个树相等,自然是镜像,返回true;
2.A的该结点为NULL,B的该结点不为NULL(或者A的该结点不是NULL,B的该结点为NULL),那么不是镜像,返回false;
3.A和B均有值,但不相等,自然不是镜像,返回false。
我们把这个结点看做是其父结点的一个子树,然后逐层向上去扩展。
判断的时候是由上向下,只要两个结点值相等就继续递归。

代码实现

 bool isSym(TreeNode* root1, TreeNode* root2)
{
    if (root1 == nullptr && root2 == nullptr)
        return true;
    if (root1 == nullptr || root2 == nullptr)
        return false;
    if (root1->val != root2->val)
        return false;
    return isSym(root1->left, root2->right) && isSym(root1->right, root2->left);
}
bool isSymmetric(TreeNode* root) {
    return isSym(root, root);
}

时间复杂度&空间复杂度

运行时间

Leetcode 102:二叉树的层序遍历

题目描述

给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。

解题思路

这其实就是二叉树的BFS,但是和之前又有一点不同,那就是保存的结果不是一个vector,而是一个vector类型的vector数组,数组里面有多个vector,每个vector里面的元素是这一层的值。所以关键在于如何存储呢?那这个就可以借鉴之前做过的二叉树的右视角这个题,我们储存一个size,代表这一层有多少个元素,然后执行一个for循环,在这个for循环里面把元素push到一个tmp数组中,for循环完成后,把tmppush到result即可。

但是不知道为什么,那个for循环如果我用while循环的话,就会超时,需要研究一下。

代码实现

vector<vector<int>> levelOrder(TreeNode* root) {
    vector<vector<int>> result;
    if (root == nullptr)
        return result;
    queue<TreeNode*>q;
    TreeNode* tt;
    q.push(root);
    while (!q.empty())
    {
        int size = q.size();
        vector<int>tmp;
        for(int i=0;i<size;i++)
        {
            tt = q.front();
            tmp.push_back(tt->val);
            q.pop();
            if (tt->left)
                q.push(tt->left);
            if (tt->right)
                q.push(tt->right);
        }
        result.push_back(tmp);
    }
    return result;
}

执行用时和内存消耗

运行时间

Leetcode 104:二叉树的最大深度

题目描述

给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明: 叶子节点是指没有子节点的节点。

示例

给定二叉树 [3,9,20,null,null,15,7],返回它的最大深度为3。

题目解析:递归法

如果一棵树只有一个结点,那么深度为1.如果根节点只有左子树而没有右子树,那么深度就是左子树深度+1;同理,对于右子树也是如此。如果既有左子树,也有右子树,那么该树的深度就是左右子树深度的最大值+1。所以可以利用递归的方式实现该题目。

代码实现:递归法


int maxDepth(TreeNode* root) {         int Heightl,Heightr,MaxH;         if(root)         {             Heightl=maxDepth(root->left);             Heightr=maxDepth(root->right);             MaxH=(Heightl>Heightr)?Heightl:Heightr;             return MaxH+1;         }         else         {             return 0;         }     }

题目解析:广度优先

借鉴层序遍历的方法,只不过使用了deque,不具体说思路了,比较简单。

代码实现:广度优先

int maxDepth(TreeNode* root) {
        if(root==nullptr) return 0;
        deque<TreeNode* > q;
        q.push_back(root);
        int deep=0;
        while(!q.empty())
        {
            ++deep;
            int len=q.size();
            for(int i=1;i<=len;i++)
            {
                TreeNode *tt=q.front();
                q.pop_front();
                if(tt->left)
                    q.push_back(tt->left);
                if(tt->right)
                    q.push_back(tt->right);
            }
        }
        return deep;
    }

时间复杂度&空间复杂度

递归法:

运行时间

广度优先:

运行时间

可以看出,广度优先算法提升了速度,减小了内存消耗。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注