DS哈希查找--Trie树

本文介绍了一种基于Trie树的数据结构实现方法,详细解释了如何构建Trie树并进行公共前缀查询。通过使用C++代码示例,演示了Trie树的构建过程及其层次遍历结果,并展示了如何计算特定前缀下的单词数量。
摘要由CSDN通过智能技术生成

题目描述

Trie树又称单词查找树,是一种树形结构,如下图所示。

它是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来节约存储空间,最大限度地减少无谓的字符串比较,查询效率比哈希表高。

输入的一组单词,创建Trie树。输入字符串,计算以该字符串为公共前缀的单词数。

(提示:树结点有26个指针,指向单词的下一字母结点。)

输入

测试数据有多组

每组测试数据格式为:

第一行:一行单词,单词全小写字母,且单词不会重复,单词的长度不超过10

第二行:测试公共前缀字符串数量t

后跟t行,每行一个字符串

输出

每组测试数据输出格式为:

第一行:创建的Trie树的层次遍历结果

第2~t+1行:对每行字符串,输出树中以该字符串为公共前缀的单词数。

输入样例1 

abcd abd bcd efg hig
3
ab
bc
abcde

输出样例1

 abehbcficddggd
2
1
0

AC代码

#include<iostream>
#include<sstream>
#include<vector>
#include<queue>
using namespace std;
struct Node{
    Node*next[26]={NULL};
};
class Trie{
    Node*root=new Node;
public:
    Trie(){
        string data;
        getline(cin, data);
        stringstream turn(data);
        while(turn >> data){
            int i=0;
            Node*current=root;
            while(i<data.size()&&current->next[data[i]-'a']){
                current=current->next[data[i]-'a'];
                i++;
            }
            for(;i<data.size();i++){
                Node*newOne=new Node;
                current=current->next[data[i]-'a']=newOne;
            }
        }
        BFS();
        int t;
        cin>>t;
        while(t--){
            cin>>data;
            Find(data);
        }
    }
    void BFS(){
        queue<Node*>open;
        open.push(root);
        while(!open.empty()){
            Node*current=open.front();
            open.pop();
            for(int i=0;i<26;i++)
                if(current->next[i]){
                    cout<<char(i+'a');
                    open.push(current->next[i]);
                }
        }
        cout<<endl;
    }
    void DFS(Node*current,int&count){
        bool leave=true;
        for(int i=0;i<26;i++)
            if(current->next[i]){
                leave= false;
                break;
            }
        if(leave){
            count++;
            return;
        }
        for(int i=0;i<26;i++)
            if(current->next[i])
                DFS(current->next[i],count);
    }
    void Find(string&data){
        Node*current=root;
        int i=0,count=0;
        while(i<data.size()&&current->next[data[i]-'a']){
            current=current->next[data[i]-'a'];
            i++;
        }
        if(i==data.size()){
            for(int j=0;j<26;j++)
                if(current->next[j])
                    DFS(current->next[j],count);
            cout<<count<<endl;
        }else cout<<'0'<<endl;
    }
};
int main() {
    Trie test;
    return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MaolinYe(叶茂林)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值