Recursive

对于s的每一个节点,我们都要调用isSame来判断两棵树是否相同。

时间复杂度 O(mn)

class Solution {
public:
    bool isSubtree(TreeNode* s, TreeNode* t) {
        if (s==NULL && t==NULL) return true;
        if (s==NULL) return false;
        return isSame(s,t) || isSubtree(s->left,t) || isSubtree(s->right,t);
    }

    bool isSame(TreeNode *a, TreeNode *b){
        if (a==NULL && b==NULL) return true;
        if (a==NULL || b==NULL) return false;
        return a->val==b->val && isSame(a->left,b->left) && isSame(a->right,b->right);
    }
};

PreOrder + Serialize

本质就是用preOrder来serialize两个树。如果t是子树,那么序列化之后,t一定是s的字串。

假设concatenate长度为n的字符串时间为O(n),serialize对于每个节点都要concatenate一下,时间复杂度O(n^2)。

需要注意的是serialize函数,to_string(root->val) 前又加了一个' ',这是为了防止诸如 "2 # #" 在 "12 # #" 中的情况产生。

class Solution {
public:
    bool isSubtree(TreeNode* s, TreeNode* t) {
        string s1=serialize(s);
        string s2=serialize(t);
        return s1.find(s2)!=-1;
    }

    string serialize(TreeNode* root) {
        if (root==NULL) return "#";
        return ' '+to_string(root->val)+' '+serialize(root->left)+' '+serialize(root->right);
    }
};
02-12 02:03
查看更多