1.继续补上树的内容,今天学了树的遍历,以及对代码方面的补充
2.kmp算法完整学习
今天对于树这个遍历代码的剖析,发现一 代码格式方面,无论是学习的书本上还是学习的视频里面,基本上都是已经开始用到比较专业的代码改变,即专业名称进行顺手的转换,对于以下的树的遍历代码,为一个二叉链表支撑起来的,对于各个板块进行了明确的分类,比较核心的思想就是递归,通过递归去实现我们想要达到的遍历二叉树
代码如下
#include<stdio.h>
#include<stdlib.h>
typedef char Elemtype;
typedef struct BiTNode
{
char data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
void CreateBiTree(BiTree *T)
{
char c;
scanf("%c",&c);
if(c=='#')
{
*T=NULL;
}
else
{
*T=(BiTNode *)malloc(sizeof(BiTNode));
(*T)->data=c;
CreateBiTree(&(*T)->lchild);
CreateBiTree(&(*T)->rchild);
}
}
void visit(char c,int level)
{
printf("%c位于第%d层\n",c,level);
}
void PreOrderTraverse(BiTree T,int level)
{
if(T)
{
visit(T->data,level);
PreOrderTraverse(T->lchild,level+1);
PreOrderTraverse(T->rchild,level+1);
}
}
int main()
{
int level=1;
BiTree T=NULL;
CreateBiTree(&T);
PreOrderTraverse(T,level);
return 0;
}
这边总结一下kmp算法
kmp算法的核心是对于子字符串进行提前剖析,从而达到效率提高的效果,kmp算法核心在于子字符串而非去对应的母字符串,其中为了对子字符串的分析有所效果,一般会带上一个next数组来记录如果在这个子字符上面失配了然后需要做什么,只要看next数组
这里有kmp算法完整代码、
#include<stdio.h>
typedef char* String;
void get_next(String T,int *next)
{
int j=0;
int i=1;
next[1]=0;
while(i<T[0])
{
if(j==0||T[i]==T[j])
{
i++;
j++;
if(T[i]!=T[j])
{
next[i]=j;
}
else
{
next[i]=next[j];
}
}
else
{
next[j]=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(j==0||S[i]==T[j])
{
i++;
j++;
}
else
{
j=next[j];
}
}
if(j>T[0])
{
return i-T[0];
}
else
{
return 0;
}
}