牛客网刷题|树的子结构

题目来源:牛客网
编程链接

题目描述:

输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)

解析:

可以想见整个过程:1、A,B首先看根节点对不对,如果对了,看根节点的左右结点对不对。
2、若第一个根节点没有配对成功,则换成A的左子结点来配对。
3、若左子结点没有成功,则换成A的右子结点来配对。

代码:

/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};*/
class Solution {
public:
    bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
    {
        bool result = false;
        if(pRoot1 !=NULL && pRoot2 !=NULL)
        {
            if(pRoot1->val == pRoot2->val)  //如果根结点配对了,则直接继续
            {
                result = HasSubTree2(pRoot1,pRoot2);
            }
            if(!result)
            {
                result = HasSubtree(pRoot1->left,pRoot2);
            }
            if(!result)
            {
                result = HasSubtree(pRoot1->right,pRoot2);
            }
        }        
        return result;
    }

    bool HasSubTree2(TreeNode* pRoot1,TreeNode* pRoot2)
    {
        if(pRoot2==NULL)
            return true;
        if(pRoot1 == NULL)
            return false;
        if(pRoot1->val != pRoot2->val)
            return false;
        return HasSubTree2(pRoot1->left,pRoot2->left) && HasSubTree2(pRoot1->right,pRoot2->right);       
    }
};

运行时间:3ms;占用内存:480k

别人的代码:
相同的思路

/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};*/

class Solution {
public:
    bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
    {
        if (pRoot1 == nullptr || pRoot2 == nullptr)
            return false;   //直接返回错误
        return isTheSameTree(pRoot1, pRoot2) || 
            HasSubtree(pRoot1->left, pRoot2) || HasSubtree(pRoot1->right, pRoot2);
    }
    bool isTheSameTree(TreeNode* pRoot1, TreeNode* pRoot2)
    {
        if (pRoot2 == nullptr)
            return true;
        if (pRoot1 == nullptr && pRoot2 != nullptr)
            return false;
        return pRoot1->val == pRoot2->val && 
            isTheSameTree(pRoot1->left, pRoot2->left) && isTheSameTree(pRoot1->right, pRoot2->right);
    }
};

猜你喜欢

转载自blog.csdn.net/legalhighhigh/article/details/80159484