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)/**
* 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);
}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)})"