这是一道最简单的trie树的题

有趣的是这道题的测试用例无法在VS上调试,只能在框框里不断提交测试了,哈哈

最基本的Trie树,插入和查找操作没什么好说的

注意节点添加一个count变量作为附加条件,记录该字母这这个位置出现的次数,还有几处需要注意的逻辑问题,在注释中标出了

直接上代码了:

#include <iostream>
#include <algorithm>
#include <string.h>
#include <stdio.h>
using namespace std;
char strList[1005][25];
struct node
{
    int count;
    node* childs[26];
    node(){
        count = 0;
        int i;
        for(i=0;i<26;i++){
            childs[i] = NULL;
        }
    }
};

node* root = new node;
node* currentNode;
void insert(char *str)
{
    int i=0;
    currentNode = root;
    
    for(i=0;i<strlen(str);i++){
        int index= str[i] - 'a';
        if(currentNode->childs[index]!=NULL){
            currentNode = currentNode->childs[index];
            ++(currentNode->count);
        }else{
            currentNode->childs[index] = new node;
            currentNode = currentNode->childs[index];
            currentNode->count = 1;
        }
    }    
}

void search(char *str)
{
    currentNode = root;
    int i;
    char res[23];
    for(i=0;i<strlen(str);i++){
        int index = str[i] - 'a';
        //if(currentNode->childs[index]!=NULL)//没有必要判断,因为根据题意,此时一定是有的
        currentNode = currentNode->childs[index];
        res[i] = str[i];
        res[i+1]='\0';//必须在这里加入'\0',因为如果没有找到,则会跳出,如果在下面的判断中加‘\0’会导致最后没有结尾的'\0'.
        if(currentNode->count == 1){break;}//输出+return 或者 直接break
    }
    printf("%s %s\n",str,res);
    return;
}
int main()
{
    int i,t=0;
    while(scanf("%s",strList[t])!=EOF)
    {
        insert(strList[t]);
        t++;
    }
    for (i = 0; i < t; ++i)
    {
        search(strList[i]);
    }
    return 0;
}

 

posted on 2016-04-07 20:22  岳阳楼  阅读(250)  评论(0编辑  收藏  举报