多叉树的前序遍历_多叉树的创建和遍历(为Trie树做准备)

本文介绍了Trie树作为搜索引擎提示词解决方案的背景,并复习了多叉树的实现和遍历,特别是前序遍历。通过示例展示了如何使用二叉链表法创建多叉树,包括插入节点和前序、后序遍历的函数实现。在主函数中,创建了一个多叉树并进行了先序和后序遍历的打印。
摘要由CSDN通过智能技术生成

trie树实际上是一种多叉树的应用,Trie树是用来解决,搜索引擎中,输入前缀可以给出提示词的非常好的解决方案

在实现trie书算法以前,我们先回顾温习下,多叉树的实现和遍历(对于我们trie树的实现和便利帮助很大),这里就不说普通二叉树,因为原理一样,但相对简单

下面是算法实现,这个算法参考了这本书中的描述和定义,用了一个很节省空间的结构定义

并没有在父节点中存储所有的子节点,而是存储了节点的链表,一般叫做二叉链表法,这样算法看起来非常像二叉树了

#include

#include

#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]

最后说一下数学之美中的一道题目,是按照层级遍历二叉树(当然可以推广到多叉树),这个以后再说吧,其实我一直在想如果数学之美中,这道题目不是限定的那么死,我们完全可以在数据结构上做文章,让这个问题变得很简单,就是在节点存储上同一层节点的链表,也算是借鉴了上面的一个结构描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值