572. Subtree of Another Tree

Given two non-empty binary trees s and t, check whether tree t has exactly the same structure and node values with a subtree of s. A subtree of s is a tree consists of a node in s and all of this node's descendants. The tree s could also be considered as a subtree of itself.

Example 1: Given tree s:

     3
    / \
   4   5
  / \
 1   2

Given tree t:

   4 
  / \
 1   2

Return true, because t has the same structure and node values with a subtree of s.

Example 2: Given tree s:

     3
    / \
   4   5
  / \
 1   2
    /
   0

Given tree t:

   4
  / \
 1   2

Return false.

// Recursion
bool helper(TreeNode*s, TreeNode* t) {
    if (!s || !t) return s == t;
    return s->val == t->val && helper(s->left, t->left) && helper(s->right, t->right);
}
bool isSubtree(TreeNode* s, TreeNode* t) { // time: (m*n); space: O(m + n)
    if (!s || !t) return s == t;
    return helper(s, t) || isSubtree(s->left, t) || isSubtree(s->right, t);
}
// Serialization Solution
void serialize(TreeNode* node, ostringstream& os) {
    if (!node) os << ",#";
    else {
        os << "," << node->val; // add a char before node value to differentiate the case such as [12] and [2]
        serialize(node->left, os);
        serialize(node->right, os);
    }
}
bool isSubtree(TreeNode* s, TreeNode* t) { // time: O(m + n); space: O(m + n)
    ostringstream os1, os2;
    serialize(s, os1);
    serialize(t, os2);
    return os1.str().find(os2.str()) != string::npos;
}

Last updated

Was this helpful?