Solution 1DFS Recursive

  • TimeO(n * m)
  • SpaceO(n + m)

Where, n is the number of nodes in root and m is the number of nodes in subRoot.

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def isSubtree(self, root: Optional[TreeNode], subRoot: Optional[TreeNode]) -> bool:
        '''
        Time Complexity: O(n * m)
        Space Complexity: O(n + m)
        Where, `n` is the number of nodes in `root` and `m` is the number of nodes in `subRoot`.
        '''
        if self.isSametree(root, subRoot):
            return True
        if root != None:
            return self.isSubtree(root.left, subRoot) or self.isSubtree(root.right, subRoot)
        return False

    def isSametree(self,  root1: Optional[TreeNode], root2: Optional[TreeNode]) -> bool:
        if root1 == None and root2 == None:
            return True
        if root1 == None or root2 == None or root1.val != root2.val:
            return False
        return self.isSametree(root1.left, root2.left) and self.isSametree(root1.right, root2.right)
Leet Code/python.py · L1612–1637
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
public boolean isSubtree(TreeNode root, TreeNode subRoot) {
    /*
     * Time complexity: O(n*m)
     * Space complexity: O(n) for the recursion stack.
     * Where, `n` is the number of nodes in `root` and `m` is the number of nodes in `subRoot`.
     */
    if (isSametree(root, subRoot)) {
        return true;
    }
    if (root == null) {
        return false;
    }
    return isSubtree(root.left, subRoot) || isSubtree(root.right, subRoot);
}
public boolean isSametree(TreeNode root1, TreeNode root2) {
    if (root1 == null && root2 == null) {
        return true;
    }
    if (root1 == null || root2 == null || root1.val != root2.val) {
        return false;
    }
    return isSametree(root1.left, root2.left) && isSametree(root1.right, root2.right);
}
Leet Code/java.java · L1079–1117

Solution 2Serialize

Python
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def isSubtree(self, root: Optional[TreeNode], subRoot: Optional[TreeNode]) -> bool:
        return self.serialize(subRoot) in self.serialize(root)
    
    def serialize(self, node: Optional[TreeNode]) -> str:
        if node == None: return "N"
        return f"({node.val},{self.serialize(node.left)},{self.serialize(node.right)})"
Leet Code/python.py · L1638–1651