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 ...