[
kmp
tree
recursion
dfs
]
BinarySearch 0849 Find a Linked List in a Binary Tree
Problem statement
https://binarysearch.com/problems/Find-a-Linked-List-in-a-Binary-Tree/
Solution
The idea is to extend kmp algorithm for trees here! First, let us evaluate prefix function, which we keep in f
. Then we traverse tree and do similar logic as we do in kmp.
Complexity
It is O(n + m)
for time and space.
Code
class Solution:
def solve(self, root, h):
A = []
while h:
A += [h.val]
h = h.next
n = len(A)
f = [-1] * (n + 1)
for i in range(1, n + 1):
f[i] = f[i - 1] + 1
while f[i] > 0 and A[i - 1] != A[f[i] - 1]:
f[i] = f[f[i] - 1] + 1
def dfs(r, i):
if i >= n: return True
if not r: return False
i += 1
while i > 0 and r.val != A[i - 1]:
i = f[i - 1] + 1
return dfs(r.left, i) or dfs(r.right, i)
return dfs(root, 0)