多叉树的前序遍历_多叉树的创建和遍历(为Trie树做准备)
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]
最后说一下数学之美中的一道题目,是按照层级遍历二叉树(当然可以推广到多叉树),这个以后再说吧,其实我一直在想如果数学之美中,这道题目不是限定的那么死,我们完全可以在数据结构上做文章,让这个问题变得很简单,就是在节点存储上同一层节点的链表,也算是借鉴了上面的一个结构描述
多叉树的前序遍历_多叉树的创建和遍历(为Trie树做准备)相关推荐
- 原生 遍历_迭代器模式统一集合的遍历方式
今天来介绍迭代器模式(Iterator Design Pattern),它还有另一个名字,叫作游标模式(Cursor Design Pattern). 1,遍历集合元素 现在的高级语言(比如 C++, ...
- java实现二叉树广度优先遍历_二叉树之深度优先和广度优先遍历(Java)
tree.png 1. 二叉树结构定义 public static class Tree { int data; Tree left; Tree right; public Tree(int data ...
- 螺旋遍历_螺旋形式的水平阶遍历
螺旋遍历 Problem statement: 问题陈述: Write a program to print Level Order Traversal in spiral form of a bin ...
- 二叉树层级遍历_二叉树中的层级顺序遍历
二叉树层级遍历 Level Order Traversal is one of the methods for traversing across a Binary Tree. In this art ...
- java的list遍历_【java】list集合遍历的5种方式
平凡也就两个字: 懒和惰; 成功也就两个字: 苦和勤; 优秀也就两个字: 你和我. 跟着我从0学习JAVA.spring全家桶和linux运维等知识,带你从懵懂少年走向人生巅峰,迎娶白富美! 关注微信 ...
- C语言二叉树的创建与遍历
二叉树的创建与遍历 文章目录 二叉树的创建与遍历 前言 一.二叉树的结构 二.二叉树创建和三种遍历 1. 2.前序遍历 3.中序遍历 4.后序遍历 5.测试代码 总结 前言 二叉树(binary tr ...
- 多叉树的前序遍历_二叉树的非递归遍历的思考
封面图来自wikipedia 1 简介 二叉树的深度优先遍历(前序遍历.中序遍历.后序遍历)是一个比较基本的操作.如果使用递归的做法,很容易写出相应的程序:而如果使用非递归的做法,虽然也能写出相应的代 ...
- LeetCode Algorithm 589. N 叉树的前序遍历
589. N 叉树的前序遍历 Ideas 二叉树的前序遍历模板,拿过来稍微一改就完事了. def preorderTraversalLoop(node):if not node:returnstack ...
- leetcode 589. N 叉树的前序遍历,590. N 叉树的后序遍历(Java版)
589. N 叉树的前序遍历 https://leetcode-cn.com/problems/n-ary-tree-preorder-traversal/ 题解 import java.util.A ...
最新文章
- Odoo(OpenERP)配置文件详解
- 1 折限时团购!王牌讲师团年度精品课劲爆来袭​!
- eclipse 如何忽略js文件报错
- .net core针对async ()=的安全处理
- lambda ::_您无法从这里到达那里:Netlify Lambda和Firebase如何使我陷入无服务器的死胡同
- php 模拟登陆新浪微博,[Javascript] 爬虫 模拟新浪微博登陆
- 【安全热点】阿里巴巴月饼门,观点两极化,孰对孰错?
- 史上最全的launch的解析来啦,木有之一欧
- 成都链安xFootprint 2022 Web3 安全研报
- Ceres Solver:从入门到使用
- PHP如何启动scrapy,python,_新手Scrapy爬虫运行问题,python - phpStudy
- 石油化工行业智能供应链管理系统解决方案:数智化供应链平台推动企业转型智能化发展
- 2021BI及数据可视化领域最具商业合作价值企业盘点
- 曾经,被嫌弃的腾讯股权——读《腾讯传》
- 【SQLServer】用SQL语句更改数据库名,表名,列名
- UG编程-适合新手的详细讲解
- Redis 开机自启
- 数据库——sql修改主键
- 青岛企业邮箱怎么注册
- 原理 拉普拉斯金字塔_图像金字塔分层算法
热门文章
- Java中Lambda表达式的使用(转)
- 4-1 :input表单选择器 jQuery第四章 很关键 好像 刚好可以解决 微信自动回复...
- LeetCode Palindrome Linked List (回文链表)
- Android UI自定义Spinner下拉框(用popuwindow实现)-转
- bzoj1449 [JSOI2009]球队收益
- linux uname命令参数及用法详解--linux查看系统信息命令
- 万网域名注册查询接口(API)的说明
- Oracle拆分字符串,字符串分割的函数。
- 如何用Apache POI操作Excel文件-----如何用Apache POI 画一个离散图
- SSH2整合需要jar包解释