每日总结 1.11

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;
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值