Subtree of Another Tree
Problem
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`.
Solution
public class Solution {
public boolean isSubtree(TreeNode s, TreeNode t) {
if (s == null || t == null) return false; //Problem requires to return false as long as one of them is null
return isSame(s, t) ? true : isSubtree(s.left, t) || isSubtree(s.right, t);
}
private boolean isSame(TreeNode s, TreeNode t) {
if (s == null && t == null) return true;
if (s == null || t == null) return false;
return s.val == t.val && isSame(s.left, t.left) && isSame(s.right, t.right);
}
}
Analysis
We use pre-order traversal in this solution
We start checking the entire nodes of s
Then we go checking s.left
or s.right
with t
Notice that isSame()
has to check all nodes within two given trees
Complexity:
- Time: O(n m)*, in worst case we have to traversal all nodes in two trees
- Space: O(n), where n is the # of nodes in
s
tree. It happens whent
is subtree of last node ins