字典树的建立,插入,查找

来源:互联网 发布:图标制作软件手机版 编辑:程序博客网 时间:2024/06/05 17:27
#include <iostream>
#include<string.h>
#define N 100000
#define MAX 26
using namespace std;
typedef struct node         //自定义一个结构体字典树
{
 struct node *next[MAX];//对每个节点最多26个孩子节点
 int num;               //表示存储的孩子节点的个数
}Node;
Node *createNew()          //创建字典树
{
 Node *p=new Node;      //创建一个结构体,p指向头 
 for(int i=0;i<MAX;i++)
 {
  p->next[i]=NULL;   //每个节点最多26个孩子节点,对其初始化为0
  }
  p->num=0;             //叶子节点以下无孩子节点,将num设置为0,表示其无子节点了
  return p;             //对一个字典树,相当于递归,只存在一个根节点和26个子节点,
                        //子节点num均设置为0,对子节点,如何想继续存在孩子节点,则
         //以此子节点为根,再创建一个字典树
}
//插入一个字符
void Insert(char str[],Node *head)
{
 int len=strlen(str);
 Node *t,*p=head;
 for(int i=0;i<len;i++)
 {
  int c=str[i]-'a';   //对于一个字符串,每个节点保存的不是单个字符,而是0-25的数
  if(p->next[c]==NULL)  //对于一个字符串,他的长度为len则他的深度也为len,    
  {                     //插入第i个字符,如果还没达到字符串长度,则需要在这个节点下再建立
   t=createNew();  //一个字典树,用以插入下一个字符。
   p->next[c]=t;   //我们这里将其理解为每个字典树只有一层,深度为1,共26个节点,如果
   p->num++;       //字符串长度有s则我们需要建立s层字典树。
   }
   else
   {
    p=p->next[c];
   }
 }
}
//字典树的查找
int search(char str[],Node *head)
{
 Node *p=head;
 int len=strlen(str);
 int count = 0;     //count是用来计数节点下层有几个孩子节点的
 for(int i=0;i<len;i++)
 {
  int c=str[i]-'a';
  if(p->next[c]==NULL)//对于字符串中的某一个字符,如果字典树中,
  {     //这个节点下面已经没有孩子节点,
      cout<<"不存在字符串"<<endl;//则字符串这个位置后的字符在字典树中是不可能继续找到的,
   count=0;           //所以可以返回“不存在该字符串”
   return 0;
  }
  else
  {
   p=p->next[c];//否则就是这个节点下面有子节点,则指针下移以为,继续找
   count=p->num;
  }
  }
  return count;
}
0 0
原创粉丝点击