C 高階資料結構 Trie樹

2021-10-04 12:12:17 字數 3583 閱讀 9842

trie樹,又稱字典樹或字首樹,是一種有序的、用於統計、排序和儲存字串的資料結構,它與二叉查詢樹不同,關鍵字不是直接儲存在節點中,而是由節點在書中的位置決定。

乙個節點的所有子孫都有相同的字首,也就是這個節點對應的字串,而根節點對應空字串。一般情況下,不是所有的節點都有對應的值,只有葉子節點和部分內部節點所對應的鍵才有相關的值。

trie樹的最大優點就是利用字串的公共字首來減少儲存空間與查詢時間,從而最大限度地減少無謂的字串比較,是非常高效的字串查詢資料結構。

#include

#define trie_max_char_num 26

//定義trienode

struct trienode}}

;//trienode的前序遍歷

void

preorder_trie

(trienode* node,

int layer)

printf

("%c"

, i+

'a');if

(node-

>child[i]

->is_end)

printf

("\n");

preorder_trie

(node-

>child[i]

, layer +1)

;}}}

intmain()

執行結果為:

a

---b

------c

(end)

----

-----d

(end)

------d

(end)

b(end)

---c

------d

(end)e--

-f--

----

g(end)

對trie樹的整體測試

#include

#include

#define max_trie_char_num 26

struct trienode}}

;void

get_all_word_from_trie

(trienode* node, std::string& word, std::vector

& wordlist)

get_all_word_from_trie

(node-

>child[i]

, word, wordlist)

; word.

erase

(word.

length()

-1,1

);}}

}void

preorder_trie

(trienode* node,

int layer)

printf

("%c"

, i +

'a');if

(node-

>child[i]

->is_end)

printf

("\n");

preorder_trie

(node-

>child[i]

, layer +1)

;}}}

class

trietree

~trietree()

} trienode _root;

void

insert

(const

char

* word)

ptr = ptr-

>child[pos]

; word++;}

ptr-

>is_end =

true;}

bool

search

(const

char

* word)

ptr = ptr-

>child[pos]

; word++;}

return ptr-

>is_end;

}bool

startswith

(const

char

* prefix)

ptr = ptr-

>child[pos]

; prefix++;}

return

true;}

private

: trienode*

new_node()

std::vector> _node_vec;};

intmain()

printf

("\n");

printf

("search:\n");

printf

("abc: %d\n"

,trie_tree.

search

("abc"))

;printf

("abcd: %d\n"

,trie_tree.

search

("abcd"))

;printf

("bc: %d\n"

,trie_tree.

search

("bc"))

;printf

("b: %d\n"

,trie_tree.

search

("b"))

;printf

("\n");

printf

("ab: %d\n"

, trie_tree.

startswith

("ab"))

;printf

("abc: %d\n"

, trie_tree.

startswith

("abc"))

;printf

("bc: %d\n"

, trie_tree.

startswith

("bc"))

;printf

("fg: %d\n"

, trie_tree.

startswith

("fg"))

;return0;

}

執行結果:

preorder_trie:a--

- b--

----

c(end)

----

-----d

(end)

------d

(end)

b(end)

--- c

------d

(end)e--

- f--

----

g(end)

all words :

abcabcd

abdb

bcdefg

search :

abc:

1abcd :

1bc :

0b :

1ab :

1abc :

1bc :

1fg :

0

資料結構 TRIE樹

分類 data structure 2009 04 19 22 31 5425人閱讀收藏 舉報trie樹 trie樹就是字元樹,其核心思想就是空間換時間。舉個簡單的例子。給你100000個長度不超過10的單詞。對於每乙個單詞,我們要判斷他出沒出現過,如果出現了,第一次出現第幾個位置。這題當然可以用h...

資料結構 TRIE樹

trie樹 trie樹就是字元樹,其核心思想就是空間換時間。舉個簡單的例子。給你100000個長度不超過10的單詞。對於每乙個單詞,我們要判斷他出沒出現過,如果出現了,第一次出現第幾個位置。這題當然可以用hash來,但是我要介紹的是trie樹。在某些方面它的用途更大。比如說對於某乙個單詞,我要詢問它...

資料結構之Trie樹

1 什麼是trie樹 trie樹,即字典樹,又稱單詞查詢樹或鍵樹,是一種樹形結構,是一種雜湊樹的變種。典型應用是用於統計和排序大量的字串 但不僅限於字串 所以經常被搜尋引擎系統用於文字詞頻統計。它的優點是 最大限度地減少無謂的字串比較,查詢效率比雜湊表高。trie的核心思想是空間換時間。利用字串的公...