字典樹 trie樹

2021-06-15 01:18:36 字數 3101 閱讀 1611

amy     56

ann 15

emma 30

rob 27

roger 52

首先存入amy, level 0表示根,不持有資料。其餘每個節點持有乙個字元;葉子節點持有資料,且持有的字元為'\0'

.     <- level 0 (root)

|a <- level 1

|m <- level 2

|y <- level 3

|\0 56 <- level 4

新增ann後,字尾樹如下,二者共享字首'a'

.|a

/ \

m n

| |

y n

| |

\0 56 \0 15

下面加入emma,由於emma與之前新增的鍵值沒有相同字首,所以直接加入根節點下。

.

/ \

a e

/ \ |

m n m

| | |

y n m

| | |

\0 56 \0 15 a

|\0 30

將rob與roger加入後,所得字典樹如下:

.

/ | \

a e r

/ \ | |

m n m o

| | | / \

y n m b g

| | | | |

\0 56 \0 15 a \0 27 e

| |

\0 30 r

|\0 52

現在有2個問題:

如果繼續新增anne為67,將出現什麼狀況?

每個節點有多少個子節點?

解決辦法:

1. 每個節點存放乙個陣列,可以容納所有鍵值中的字元

2. 採用鍊錶

3. 左兒子右兄弟表示法

這裡我們採用左孩子右兄弟的表示方法。上述資料可以表示為:     

|

a --------- e ----- r

| | |

m --- n m o

| | | |

y n m b ----- g

| | | | |

\0 56 \0 15 a \0 27 e

| |

\0 30 r

|\0 52

.h

class trietree

};public:

trietree(void);

~trietree(void);

bool ismember(char str);

void add(char str, int val);

void remove(char str);

int getval(char str);

private:

node *root;

node* _insert(node* subtree, char *str, int val);

node* _createsubtree(char *str, int val);

node* _delete(node* subtree, char *str);

node* _find(char *str);

void _destroy(node* subtree);

};

.cpp

trietree::trietree(void)

trietree::~trietree(void)

bool trietree::ismember(char str)

void trietree::add(char str, int val)

void trietree::remove(char str)

int trietree::getval(char str)

trietree::node* trietree::_insert(node* subtree, char *str, int val)

else if(subtree->key != str[0])

else

return subtree;

}void trietree::_destroy(node *subtree)

}trietree::node* trietree::_find(char *str)

} if(found == null)

return null;

//不能found->key == str[index]

//str可以先匹配完成

if(str[index] == '\0')

return found;

//匹配上後,向下在孩子中匹配

level = found ->child;

index += 1;

} return null;

}trietree::node* trietree::_delete(node* subtree, char *str)

else

else

}} return subtree;

}trietree::node * trietree::_createsubtree(char *str, int val)

return subtree;

}

來自:

Trie樹(字典樹)

trie樹的核心思想是用空間換時間,通過在樹中儲存字串的公共字首,來達到加速檢索的目的。例如,對於一棵儲存由英文本母組成的字串的trie樹,如下圖 trie樹在實現的時候,可以用左兒子右兄弟的表示方法,也可以在每個節點處開設乙個陣列,如上圖的方法。trie樹的主要操作是插入 查詢,也可以進行刪除。插...

字典樹 Trie樹

字典樹 trie樹 顧名思義是一種樹形結構,屬於雜湊樹的一種。應用於統計 排序 查詢單詞 統計單詞出現的頻率等。它的優點是 利用字串的公共字首來節約儲存空間,最大限度地減少無謂的字串比較,查詢效率比雜湊表高。字典樹的結構特點 根節點不代表任何字元。其他節點從當前節點回溯到根節點可以得到它代表的字串。...

trie樹(字典樹)

1.trie樹,又名字典樹,顧名思義,它是可以用來作字串查詢的資料結構,它的查詢效率比雜湊表還要高。trie樹的建樹 比如有字串 ab adb adc 可以建立字典樹如圖 樹的根節點head不儲存資訊,它有26個next指標,分別對應著字元a,b,c等。插入字串ab時,next a a 即next ...