高級數(shù)據(jù)結(jié)構(gòu)1—Trie(字典樹)

這個高級數(shù)據(jù)結(jié)構(gòu)系列我會寫三中在編程里常見的三種數(shù)據(jù)機構(gòu)徘层,分別是Trie 樹,并查集和線段樹拴驮。

trie樹(字典樹)的基礎(chǔ)知識

trie樹,又稱字典樹或前綴樹柴信,是一種有序的、用于統(tǒng)計宽气、排序和存儲字符串的數(shù)據(jù)結(jié)構(gòu)随常,它與二叉查找樹不同潜沦,關(guān)鍵字不是直接保存在節(jié)點中,而是由節(jié)點在樹中的位置決定绪氛。 一個節(jié)點的所有子孫都有相同的前綴唆鸡,也就是這個節(jié)點對應(yīng)的字符串,而根節(jié)點對應(yīng)空字符串枣察。一般情況下争占,不是所有的節(jié)點都有對應(yīng)的值,只有葉子節(jié)點和部分內(nèi)部節(jié)點所對應(yīng)的鍵才有相關(guān)的值序目。 trie樹的最大優(yōu)點就是利用字符串的公共前綴來減少存儲空間與查詢時間臂痕,從而最大限度地減少無謂的字符串比較,是非常高效的字符串查找數(shù)據(jù)結(jié)構(gòu)猿涨。

Trie樹
例1:實現(xiàn)trie樹(medium)(trie樹建立)
首先定義基本的數(shù)據(jù)結(jié)構(gòu):

class TrieNode
{
bool IsEnd;//是否為一個單詞的結(jié)尾
TrieNode* childnodes[26];
TrieNode(): IsEnd(false)
{
        for(int i = 0;i < MAX;i++)
        {
            childNode = nullptr;
        }
}
};
TrieNode

Trie樹的基本功能實現(xiàn):

class Trie {
private:
    std::vector<TrieNode*> _node_vec;
    //用來存儲new出來的結(jié)點握童,這樣在析構(gòu)的時候可以釋放內(nèi)存;
    TrieNode* new_node()
    {
        TrieNode* node = new TrieNode();
        _node_vec.push_back(node);
        return node;
    }

public:
    TrieNode* root;
public:
    Trie() {
        root = new TrieNode();
    }
    ~Trie()
    {
        for(int i =0;i<_node_vec.size();i++)
        {
            delete _node_vec[i];
        }
    }

    // Inserts a word into the trie.
    void insert(string word) {
    }
    // Returns if the word is in the trie.
    bool search(string word) {  
        }
     // Returns if there is any word in the trie
    // that starts with the given prefix.
    bool startsWith(string prefix) {
    }
};
        //獲取trie樹的所有單詞
 void get_all_word_from_trie(TrieNode*root,string &word,vector<string> &word_list)
 {
 }

插入:

void insert(string word) {
TrieNode * p=root;
int length = word.length();
for(int i =0;i<length;i++)
{
if(!p->child[word[i]-'a'])
{
p->child[word[i]]=new TrieNode();
}
p=p->child[word[i]];
}
p->isEnd=true;
}

查找:

bool search(string word) {
        int lenth = word.length();
         TrieNode *p = root;
        for(int i = 0;i<lenth;i++)
        {
            int index = word[i]-'a';
            if(!p->next[index])
            {
                return false;
            }
            else
            {
                p = p->next[index];
            }
        }
        if(p->IsLeave)  return true;
        else return false;
 }

前綴:

bool startsWith(string prefix) {
        int lenth = prefix.length();
        TrieNode *p = root;
        for(int i = 0;i<lenth;i++)
        {
            int index = prefix[i]-'a';
            if(!p->next[index])
            {
                return false;
            }
            else
            {
                p = p->next[index];
            }
        }
        return true;
    }

查找Tire樹中所有的單詞:

void get_all_word_from_trie(TrieNode*root,string &word,vector<string> &word_list)
    {//word是保存字符串的棧叛赚,
        if(!root)
            return;
        for(int i =0;i<Max;i++)
        {
            if(root->next[i])
            {
                word.push_back('a'+i);
                if(root->next[i]->IsLeave)
                word_list.push_back(word);
              //深度遍歷
                get_all_word_from_trie(root->next[i],word,word_list);
                word.erase(word.length()-1,1);//彈出棧頂字符
            }
        }
}

完整代碼可以戳??我的GitHub:還有Trie樹的模版實現(xiàn)方式哦~
希望大家一起進步~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末澡绩,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子俺附,更是在濱河造成了極大的恐慌肥卡,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件事镣,死亡現(xiàn)場離奇詭異步鉴,居然都是意外死亡,警方通過查閱死者的電腦和手機蛮浑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門唠叛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人沮稚,你說我怎么就攤上這事艺沼。” “怎么了蕴掏?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵障般,是天一觀的道長。 經(jīng)常有香客問我盛杰,道長挽荡,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任即供,我火速辦了婚禮定拟,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘逗嫡。我一直安慰自己青自,他們只是感情好株依,可當(dāng)我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著延窜,像睡著了一般恋腕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上逆瑞,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天荠藤,我揣著相機與錄音,去河邊找鬼获高。 笑死哈肖,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的谋减。 我是一名探鬼主播牡彻,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼出爹!你這毒婦竟也來了庄吼?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤严就,失蹤者是張志新(化名)和其女友劉穎总寻,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體梢为,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡渐行,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了铸董。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片祟印。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖粟害,靈堂內(nèi)的尸體忽然破棺而出蕴忆,到底是詐尸還是另有隱情,我是刑警寧澤悲幅,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布套鹅,位于F島的核電站,受9級特大地震影響汰具,放射性物質(zhì)發(fā)生泄漏卓鹿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一留荔、第九天 我趴在偏房一處隱蔽的房頂上張望吟孙。 院中可真熱鬧,春花似錦、人聲如沸杰妓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽稚失。三九已至,卻和暖如春恰聘,著一層夾襖步出監(jiān)牢的瞬間句各,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工晴叨, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留凿宾,地道東北人。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓兼蕊,卻偏偏與公主長得像初厚,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子孙技,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容