trie樹其實是一種多叉樹的應用,Trie樹是用來解決,搜索引擎中,輸入前綴能夠給出提示詞的很是好的解決方案node
在實現trie書算法之前,咱們先回顧溫習下,多叉樹的實現和遍歷(對於咱們trie樹的實現和便利幫助很大),這裏就不說普通二叉樹,由於原理同樣,但相對簡單算法
下面是算法實現,這個算法參考了<數據結構與算法分析>這本書中的描述和定義,用了一個很節省空間的結構定義數據結構
並無在父節點中存儲全部的子節點,而是存儲了節點的鏈表,通常叫作二叉鏈表法,這樣算法看起來很是像二叉樹了post
#include<stdio.h> #include<stdlib.h> #define maxsize 100 typedef struct node { char *data; struct node *first_child,*next_sibling;//fc是第一個孩子,nb是fc的臨節點 } tree; /** a / \ \ b c d /\ \ e f g 建立出來的樹結構如上 */ tree *insertTree(char *ch, tree *parent, tree *pre_sibling) { tree *child = (tree *)malloc(sizeof(tree)); child->data = ch; if (parent != NULL) parent->first_child = child; if (pre_sibling != NULL) pre_sibling->next_sibling = child; child->first_child = NULL; child->next_sibling = NULL; return child; } /**二叉鏈表建立樹*/ tree *create() { //建立root節點 tree *root = (tree *)malloc(sizeof(tree)); root->data = "A"; root->first_child = NULL; root->next_sibling = NULL; /** * 建立多個子節點 **/ tree *b = insertTree("B", root, NULL); tree *c = insertTree("C", NULL, b); tree *g = insertTree("G", c, NULL); //tree *h = insertTree("H", g, NULL); tree *d = insertTree("D", NULL, c); tree *e = insertTree("E", b, NULL); tree *f = insertTree("F", NULL, e); return root; } void preOrder(tree *root) { printf("%c ",*root->data); if (root->first_child != NULL) { preOrder(root->first_child); } if (root->next_sibling != NULL) { preOrder(root->next_sibling); } } void postOrder(tree *root) { if (root->first_child != NULL) { postOrder(root->first_child); } printf("%c ",*root->data); if (root->next_sibling != NULL) { postOrder(root->next_sibling); } } int main() { tree *root = create(); printf("先序遍歷:"); preOrder(root); printf("後序遍歷:"); postOrder(root); }
最終結果搜索引擎
先序遍歷:A B E F C G D 後序遍歷:E F B G C D A [Finished in 0.2s]code
最後說一下數學之美中的一道題目,是按照層級遍歷二叉樹(固然能夠推廣到多叉樹),這個之後再說吧,其實我一直在想若是數學之美中,這道題目不是限定的那麼死,咱們徹底能夠在數據結構上作文章,讓這個問題變得很簡單,就是在節點存儲上同一層節點的鏈表,也算是借鑑了上面的一個結構描述索引