多叉樹的建立和遍歷(爲Trie樹作準備)

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

最後說一下數學之美中的一道題目,是按照層級遍歷二叉樹(固然能夠推廣到多叉樹),這個之後再說吧,其實我一直在想若是數學之美中,這道題目不是限定的那麼死,咱們徹底能夠在數據結構上作文章,讓這個問題變得很簡單,就是在節點存儲上同一層節點的鏈表,也算是借鑑了上面的一個結構描述索引

相關文章
相關標籤/搜索