Skip to content

Commit 6c8d6cb

Browse files
author
Chris Wu
committed
no message
1 parent 3f898b4 commit 6c8d6cb

File tree

1 file changed

+44
-0
lines changed

1 file changed

+44
-0
lines changed

problems/subtree-of-another-tree.py

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
"""
2+
We use DFS to traverse `s`. (Or you can use BFS)
3+
If we encounter a node and `node.val==t.val`.
4+
We check if the node and t are the same tree, using `isSameTree()`.
5+
6+
In `isSameTree()` we use BFS to traverse both tree to check if they are exactly the same.
7+
We use BFS because. If some nodes are not the same, we can return early at higher level.
8+
Do need to go deep. Imagine the node that is not the same is at the bottom of the tree...
9+
10+
Time complexity is O(M*N). M is the number of nodes in s. N is the number of nodes in t.
11+
Traversing s takes O(M).
12+
`isSameTree()` takes O(N) to check all nodes in t.
13+
In the worst case, we might need to execute `isSameTree()` on every node in s.
14+
15+
Space complexity is O(M+N), since we might store all the nodes in memory.
16+
"""
17+
from collections import deque
18+
19+
class Solution(object):
20+
def isSubtree(self, s, t):
21+
def isSameTree(root1, root2):
22+
q1 = deque([root1])
23+
q2 = deque([root2])
24+
while q1 and q2:
25+
n1 = q1.popleft()
26+
n2 = q2.popleft()
27+
if n1.val!=n2.val: return False
28+
if n1.left: q1.append(n1.left)
29+
if n1.right: q1.append(n1.right)
30+
if n2.left: q2.append(n2.left)
31+
if n2.right: q2.append(n2.right)
32+
33+
#check if both queue are empty.
34+
#if both queue are empty, all nodes are checked.
35+
return not q1 and not q2
36+
37+
stack = []
38+
stack.append(s)
39+
while stack:
40+
node = stack.pop()
41+
if node.val==t.val and isSameTree(node, t): return True
42+
if node.left: stack.append(node.left)
43+
if node.right: stack.append(node.right)
44+
return False

0 commit comments

Comments
 (0)