求二叉树的子树查找,可以将二叉树序列化,转化为字符串,然后对字符串的子串查找。
1.KMP算法
#include <stdio.h>
typedef char* String;
void get_next( String T, int *next )
{
int j = 0;//i是后缀,j是前缀
int i = 1;
next[1] = 0;
while( i < T[0] )
{
if( 0 == j || T[i] == T[j] )
{
i++;
j++;
next[i] = j;//前缀和后缀对应的T相等时,next数组后缀加1的值为前缀的值
}
else
{
j = next[j];//如果不相等时,改变前缀的值,再循环
}
}
}
// 返回子串T在主串S第pos个字符之后的位置
// 若不存在,则返回0
int Index_KMP( String S, String T, int pos )
{
int i = pos;
int j = 1;
int next[255];
get_next( T, next );
while( i <= S[0] && j <= T[0] )
{
if( 0 == j || S[i] == T[j] )
{
i++;
j++;
}
else
{
j = next[j];//失配时,确定下一次匹配的位置
}
}
if( j > T[0] )//说明找到了子字符串
{
return i - T[0];//确定字串的位置
}
else
{
return 0;//没找到子串
}
}