-
Notifications
You must be signed in to change notification settings - Fork 0
/
Check subtree using kmp algorithm
136 lines (106 loc) · 2.95 KB
/
Check subtree using kmp algorithm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
/*
Time complexity: O(N)
Space complexity: O(N)
where 'N' is the number of nodes in the given binary tree 'T'.
*/
#include <string.h>
// Function to return in-order traversal of the tree in a string.
void computeLPSArray(string pat, int M, int lps[]) {
// Length of the previous longest prefix suffix.
int len = 0;
int i = 1;
// lps[0] is always 0.
lps[0] = 0;
// The loop calculates lps[i] for i = 1 to M-1.
while (i < M) {
if (pat[i] == pat[len]) {
len++;
lps[i] = len;
i++;
} else {
if (len != 0) {
len = lps[len - 1];
// Also, note that we do not increment i here.
} else {
lps[i] = len;
i++;
}
}
}
}
bool KMPSearch(string pat, string txt) {
int M = pat.length();
int N = txt.length();
// Create lps[] that will hold the longest prefix suffix values for pattern.
int lps[M];
int j = 0; // index for pat[].
// Preprocess the pattern (calculate lps[] array).
computeLPSArray(pat, M, lps);
// Index for txt.
int i = 0;
while (i < N) {
if (pat[j] == txt[i]) {
j++;
i++;
}
if (j == M) {
return true;
}
// Mismatch after j matches.
else if (i < N && pat[j] != txt[i]) {
// Do not match lps[0..lps[j-1]] characters, they will match anyway.
if (j != 0) {
j = lps[j - 1];
} else {
i++;
}
}
}
return false;
}
string inorder(TreeNode<int> *node)
{
if (node == NULL)
{
return "NULL";
}
return inorder(node->left) + " " + to_string(node->val) + " " + inorder(node->right);
}
// Function to return post-order traversal of the tree in a string.
string postorder(TreeNode<int> *node)
{
if (node == NULL)
{
return "NULL";
}
return postorder(node->left) + " " + postorder(node->right) + " " + to_string(node->val);
}
// This function returns true if S is a subtree of T, otherwise false.
bool isSubtree(TreeNode<int> *T, TreeNode<int> *S)
{
// Base case: both trees are same.
if (T == S)
{
return true;
}
// Base case: if first tree is empty but second tree is non-empty.
if (T == NULL)
{
return false;
}
// Store in-order traversal of both trees in Tin and Sin respectively.
string Tin = inorder(T);
string Sin = inorder(S);
// Return false if Sin string is not a substring of Tin string.
if (!KMPSearch(Sin, Tin)) {
return false;
}
// Store post-order traversal of both trees in Tpost and Spost respectively.
string Tpost = postorder(T);
string Spost = postorder(S);
// Return false if Spost string is not a substring of Tpost string.
if (!KMPSearch(Spost, Tpost)) {
return false;
}
return true;
}