单词查找树

来源:互联网 发布:spss数据转换 编辑:程序博客网 时间:2024/06/06 19:38

题目描述

在进行文法分析的时候,通常需要检测一个单词是否在我们的单词列表里。为了提高查找和定位的速度,通常都画出与单词列表所对应的单词查找树,其特点如下:
1.根结点不包含字母,除根结点外每一个结点都仅包含一个大写英文字母;
2.从根结点到某一结点,路径上经过的字母依次连起来所构成的字母序列,称为该结点对应的单词。单词列表中的每个单词,都是该单词查找树某个结点所对应的单词;
3.在满足上述条件下,该单词查找树的结点数最少。
4.例如图左边的单词列表就对应于右边的单词查找树。注意,对一个确定的单词列表,请统计对应的单词查找树的结点数(包含根结点)。
这里写图片描述
输入
输入数据为一个单词列表,每一行仅包含一个单词和一个换行/回车符。每个单词仅由大写的英文字母组成,长度不超过63个字母 。文件总长度不超过32K,至少有一行数据。
输出
输出仅包含一个整数,该整数为单词列表对应的单词查找树的结点数。
样例输入

AANASPASASCASCIIBASBASIC

样例输出

13

挺久的代码了,记不太清,注释什么的也懒得写,有问题留言吧。

#include<iostream>#include<map>#include<set>#include<stack>#include<vector>#include<string>#include<sstream>#include<cstring>#include<cstdio>#include<cctype>#include<algorithm>using namespace std;typedef struct tree{    char ch;    int nodeNum;    struct tree* child[26];}node;int num=0;node* creatree(char cha){    node* t;    t=new node;    t->ch=cha;    t->nodeNum=0;    memset(t->child,0,sizeof(t->child));    num++;    return t;}node* order(node* t,char cha){        int i;         for(i=0;i<t->nodeNum;i++)        {            if(t->child[i]->ch==cha)                return t->child[i];        }        if(i==t->nodeNum)        {            node *it;            it=creatree(cha);            t->child[t->nodeNum]=it;            t->nodeNum++;            return t->child[t->nodeNum-1];        }}int main(){    string s;    node* root;    root=creatree(' ');    while(cin>>s)    {        node* temp;        for(int i=0;i<s.length();i++)        {            if(i==0)                temp=order(root,s[i]);            else            {                temp=order(temp,s[i]);            }        }    }    cout<<num<<endl;    return 0;}

刚开始学的数据结构,还是小白一个。
二叉树这个还是比较好理解的,想之前一个链表我能看一整天。学习真是一个积累的过程,学的越多,学的越快。