Trie樹的C 實現

2022-09-23 20:24:09 字數 1474 閱讀 8928

先給出lintcode的題目:實現trie樹

trie樹就是字典樹,用在搜尋引擎如百度搜尋詞條,還比如說之前dns網域名稱解析系統搜尋根據網域名稱搜尋ip。總之,是棵樹,根據字串搜尋某一節點,同時就可獲得節點儲存的資訊了。

trie樹的一般性質如下:

1.根節點不包含字元,除根節點外每乙個節點都只包含乙個字元。

2.從根節點到某一節點,路徑上經過的字元連線起來,為該節點對應的字串。

3.每個節點的所有子節點包含的字元都不相同。

那麼既然是樹,既然需要和字串匹配,那麼樹的節點怎麼定義?我們可以這樣分析,插入乙個字串「abcd」時我們乙個乙個插,且a->b->c->d,我們的節點必須要包含a等字元資訊,在查詢時好一一匹配。同時我們要有結束符來表示字串末尾,這是為了abcd和abcde區別開來。

實現**如下,lintcode通過率為70%,不知道**有問題。

/*** your trie object will be instantiated and called as such:

* trie trie;

* trie.insert("lintcode");

* trie.search("lint"); will return false

* trie.startswith("lint"); will return true

*/ #define max_child 26

class trienode

};class trie

// inserts a word into the trie.

void insert(string word)

else

t=t->child[word[i]-'a'];

i++;

}t->count=1;

}// returns if the word is in the trie.

bool search(string word)

i++;

}if((i==n)&&(t->count==1))return true;

return false;

}// returns if there is any word in the trie

// that starts with the given prefix.

bool startswith(string prefix)

i++;

}return true;

}private:

trienode* root;

};還有一種節點資料結構的方法,就是結構體換成map和bool isleaf兩個成員變數。思想一樣,也可以這樣來實現。

重點在插入時,順著某一節點不斷插入。上述用trienode*陣列作為當前節點的成員變數,實則指向下乙個節點,因為trienode*存放的是下一節點的值,陣列下標表示邊值。因為字母僅有26,所以陣列大小可以宣告為26.

map的實現機制是一樣的,鍵儲存字元,值表示下一節點的值。

Trie樹的C 實現

先給出lintcode的題目 實現trie樹 trie樹的一般性質如下 1.根節點不包含字元,除根節點外每乙個節點都只包含乙個字元。2.從根節點到某一節點,路徑上經過的字元連線起來,為該節點對應的字串。3.每個節點的所有子節點包含的字元都不相同。那麼既然是樹,既然需要和字串匹配,那麼樹的節點怎麼定義...

Trie樹(字典樹)的C 實現

trie樹,又稱字典樹 單詞查詢樹 字首樹,是一種雜湊樹的變種,應用於字串的統計與排序,經常被搜尋引擎系統用於文字詞頻統計。優點是查詢快,利用字串的公共字首來節省儲存空間,最大限度的減少無謂的字串比較。對於長度為m的鍵值,最壞情況下只需花費o m 的時間 而bst需要o mlogn 的時間。leet...

Trie樹的實現

一 定義 trie,又稱字典樹,是一種用於快速檢索的二十六叉樹結構。典型的空間換時間 二 結構圖 三 原理 特別地 和二叉查詢樹不同,在trie樹中,每個結點上並非儲存乙個元素。四 性質 0 利用串的公共字首,節約記憶體 1 在trie樹上進行檢索總是始於根結點 2 根節點不包含字元,除根節點外的每...