C++ 编程 建立Trie Tree

5 篇文章 0 订阅

Trie—单词查找树

性质:

1.根节点不包含字符,除根节点外的每一个节点都只包含一个字符。
3.每个节点的所有子节点包含的字符都不相同。

2.从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串。

优点:

1.查询快。对于长度为m的键值,最坏情况下只需花费O(m)的时间;而BST需要O(m log n)的时间。
2.当存储大量字符串时,Trie耗费的空间较少。因为键值并非显式存储的,而是与其他键值共享子串。

操作:

1.插入字符串

1).设置当前节点为根节点,设置当前字符为插入字符串中的首个字符;

2).在当前节点的子节点上搜索当前字符,若存在,则将当前节点设为值为当前字符的子节点;否则新建一个值为当前字符的子节点,并将当前结点设置为新创建的节点。

3).将当前字符设置为串中的下个字符,若当前字符为0,则结束;否则转2.

2.查找字符串

搜索过程与插入操作类似,当字符找不到匹配时返回假;若全部字符都存在匹配,判断最终停留的节点是否为树叶,若是,则返回真,否则返回假。

3.删除字符串

首先查找该字符串,边查询边将经过的节点压栈,若找不到,则返回假;否则依次判断栈顶节点是否为树叶,若是则删除该节点,否则返回真。

4.显示字符串

显示该树上所有的字符串。


C++程序实现:

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

const int MaxBranchSize=26;
class TrieNode{
public:
    string word;
    //int count;
    TrieNode* nextBranch[MaxBranchSize];
public:
    TrieNode(){
        word = "";
        //count = 0;
        memset(nextBranch,0,sizeof(TrieNode*) * MaxBranchSize);
    }
};

class Trie{
public:
    Trie(){
        pRoot = new TrieNode();
    }
    ~Trie(){
        //cout<<"deconstructor"<<endl;
    }
    void insert(string s);
    bool search(string s);
    void remove(string s);
    void printall();
private:
    TrieNode* pRoot;
    void print(TrieNode* pRoot);
};

void Trie::insert(string s){
    int index;//代表第几个字母的下标
    TrieNode* p=pRoot;
    for(int i=0;i<s.size();i++){
        index=s[i]-'a';
        if(NULL == p->nextBranch[index]){
            p->nextBranch[index] = new TrieNode();
        }
        p = p->nextBranch[index];
    }
    //p->count++; 
    if("" == p->word){
        p->word = s;      
    }
}


bool Trie::search(string s){
    int index;
    TrieNode* p = pRoot;
    for(int i=0;i<s.size();i++){
        index = s[i]-'a';
        if(p->nextBranch[index] == NULL){
            return false;
        }
        p = p->nextBranch[index];
    }
    if(p->word == s){return true;}
    return false;
};
//删除某一字符
void Trie::remove(string s){
    int index;
    TrieNode* p = pRoot;
    for(int i=0;i<s.size();i++){
        index = s[i]-'a';
        if(p->nextBranch[index] == NULL){
            cout<<"该字符串不存在"<<endl; 
            return;
        }
        p = p->nextBranch[index];
    }
    p->word = "";//如果找到了则令该字符串为空
}


void Trie::printall(){
    print(pRoot);
}
void Trie::print(TrieNode* pRoot){
    if(NULL == pRoot){
        return;
    }
    if("" != pRoot->word){
        cout << pRoot->word << endl;
    }
    for(int i=0;i<MaxBranchSize;i++){
        print(pRoot->nextBranch[i]);
    }

};

int main(){
    Trie t;
    
    //插入功能
    t.insert("apply");
    t.insert("apple");
    t.insert("blue");
    //打印功能
    t.printall();
    //查找功能    
    if(t.search("app")){
        cout<<"true"<<endl;
    }
    else{
        cout<<"false"<<endl;
    }
    if(t.search("apply")){
        cout<<"true"<<endl;
    }
    else{
        cout<<"false"<<endl;
    }
    //删除功能
    t.remove("apply");
    t.printall();
    
    return 0;

}

输出:

apple

apply

blue

false

true

apple

blue




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值