Trie树的建立与相关操作

先看下JULY大神关于Trie树的介绍 http://blog.csdn.net/v_july_v/article/details/6897097

下面贴上源代码和结果图:

#ifndef TRIE_H_INCLUDED
#define TRIE_H_INCLUDED
#include <vector>
#include <iostream>
#include <cstring>
const int max = 128;    //128个ASCII码

struct TrieNode                     //Trie结点声明
{
    bool isStr;                            //标记该结点处是否构成字符串
    struct TrieNode *child[max];            //孩子分支
    TrieNode(): isStr(false){memset(child,NULL,sizeof(child));}
};

class Trie
{
    public:
        Trie();
        void insert(const char *word);
        bool search(const char *word);
        void printAll();
        void deleteTrie(TrieNode *root);
        ~Trie();
    private:
        TrieNode *root;
        void print(TrieNode *root);
};

Trie::Trie()
{
    root = new TrieNode;
}

void Trie::insert(const char *word)
{
    if(!word || *word == '\0')
    {
        return;
    }
    TrieNode *cur = root;
    const char *begin = word;
    while(*begin)
    {
        if(!(cur->child[*begin]))
        {
            cur->child[*begin] = new TrieNode;
        }
        cur = cur->child[*begin++];
    }
    cur->isStr = true;

}

bool Trie::search(const char *word)
{
    if(!word || *word == '\0')
    {
        return false;
    }
    const char *begin = word;
    TrieNode *cur = root;
    while(*begin)
    {
        if(cur->child[*begin])
        {
            cur = cur->child[*begin++];
        }
        else
        {
            return false;
        }
    }
    return cur->isStr;
}

void Trie::print(TrieNode *root)
{
    static std::vector<char>words;
    if(root->isStr)
    {
        for(std::vector<char>::iterator iter = words.begin(); iter != words.end(); ++iter)
        {
            std::cout<<*iter;
        }
        std::cout<<std::endl;
    }
    for(int i=0; i<max; ++i)
    {
        if(root->child[i])
        {
            words.push_back((char)i);
            print(root->child[i]);
            words.pop_back();
        }
    }
}

void Trie::printAll()
{
    print(root);
}

void Trie::deleteTrie(TrieNode *root)
{
    for(int i=0; i<max; ++i)
    {
        if(root->child[i])
        {
            deleteTrie(root->child[i]);
        }
    }
    delete root;
}

Trie::~Trie()
{
    deleteTrie(root);
}

#endif // TRIE_H_INCLUDED

#include <iostream>
#include "trie.h"
using namespace std;

int main()
{
    Trie trie_tree;
    trie_tree.insert("a");
    trie_tree.insert("ab");
    trie_tree.insert("abc");
    trie_tree.insert("abd");
    trie_tree.insert("bac");
    trie_tree.insert("bad");
    cout<<trie_tree.search("abc")<<endl;
    trie_tree.printAll();
    return 0;
}



结果如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值