# LeetCode 572. Subtree of Another Tree

A simple solution beating 99.5% Python3 submission in terms of speed.

Original problem: https://leetcode.com/problems/subtree-of-another-tree/description/

# Intuition

We don’t need to check each of the node of the target Root tree whether it’s matching the subRoot tree. What if we only check those nodes having the same height as the subRoot tree?

# Approach

Note that M is the number of nodes in the Root tree; and

N is the number of nodes in the subRoot tree.

- Compute the height of the subRoot tree by traversing it. (time complexity
`N`

) - Compute the height of the Root tree (time complexity
`M`

). While traversing it, for those nodes which match the height of the subRoot tree, check if it match the subRoot tree (time complexity`logM * N`

where`logM`

means the number in the worst case i.e. a full/balanced binary tree).

# Complexity

- Time complexity: O(N + M + NlogM)
- Space complexity: O(1)

# Code

`def isSubtree(self, root: Optional[TreeNode], subRoot: Optional[TreeNode]) -> bool:`

def height(node):

if not node:

return 0

return 1 + max(height(node.left), height(node.right))

height_subroot = height(subRoot)

def verify_same_tree(node1, node2):

if not node1 and not node2:

return True

if (not node1 and node2) or (node1 and not node2) or (node1.val != node2.val):

return False

return verify_same_tree(node1.left, node2.left) and verify_same_tree(node1.right, node2.right)

found = False

def height_main(node):

if not node:

return 0

cur_height = 1 + max(height_main(node.left), height_main(node.right))

if cur_height == height_subroot:

if verify_same_tree(node, subRoot):

nonlocal found

found = True

return cur_height

height_main(root)

return found

# Note

- My solution is also posted at LeetCode forum.