C语言之一般树
1、一般树

将这种一般的树转化成我们熟悉的单链表形式,这有三层,每一层都可以看成单链表或者多个分散的单链表
数据节点如下:
struct tree {
int elem;
struct tree *FirstChild;
struct tree *NextBro;
};
每个节点和第一个孩子还有下一个兄弟链接
#include <stdio.h>
#include <stdlib.h> struct tree {
int elem;
struct tree *FirstChild;
struct tree *NextBro;
}; struct tree *root_ptr = NULL; /* 知道第一个孩子的位置,将要添加的节点放到链尾 */
int register_child(struct tree **first, struct tree *tree_ptr)
{
struct tree *ptr = *first;
while (ptr->NextBro)
ptr = ptr->NextBro; ptr->NextBro = tree_ptr;
return ;
} /* 3层树
* floor: 要添加的链表位于第几层
* FirstFa: 是第一层第几个节点的孩子
* num:节点的值
*/
int add_tree(int floor, int FirstFa, int num)
{
struct tree *tree_ptr = (struct tree *)calloc(, sizeof(struct tree));
if (!tree_ptr) {
printf("calloc error\n");
return -;
}
if (!root_ptr) {
if (floor == )
root_ptr = tree_ptr;
}
else {
if (floor == ) {
printf("root really exist\n");
goto error;
}
else if (floor == ) {
if (!(root_ptr->FirstChild))
root_ptr->FirstChild = tree_ptr;
else
register_child(&(root_ptr->FirstChild), tree_ptr);
}
else if (floor == ) {
int i;
struct tree *last_fa = root_ptr->FirstChild;
if (!last_fa) {
printf("no first floor\n"); //第1层没有
goto error;
}
for (i = ; i < FirstFa; i++)
last_fa = last_fa->NextBro;
if (!last_fa) {
printf("your father No exist\n"); //对应的父节点没有
goto error;
}
if (!(last_fa->FirstChild))
last_fa->FirstChild = tree_ptr;
else
register_child(&(last_fa->FirstChild), tree_ptr);
}
}
tree_ptr->elem = num;
tree_ptr->FirstChild = NULL;
tree_ptr->NextBro = NULL;
return ;
error:
free(tree_ptr);
return -;
} /* 输出该节点和节点下的所以数据 */
int output_fa_and_child(struct tree *fa)
{
static int cnt = ;
printf("data %d : %d\n", cnt++, fa->elem);
struct tree *vy = fa->FirstChild;
while (vy) {
output_fa_and_child(vy); //递归调用
vy = vy->NextBro;
}
return ;
} /* 输出树中的所有数据 */
int output_tree_data(void)
{
if (!root_ptr) {
printf("no data\n");
return -;
}
output_fa_and_child(root_ptr);
return ;
} int main()
{
int i;
int ret;
/* 向树中添加10个节点 */
int num[] = { ,,,,,,,,,,, };
ret = add_tree(, , num[]);
if (ret < ) {
printf("add_tree error\n");
}
for (i = ; i < ; i++) {
ret = add_tree(, , num[i]);
if (ret < ) {
printf("add_tree error\n");
}
}
for (i = ; i < ; i++) {
ret = add_tree(, , num[ + i]);
if (ret < ) {
printf("add_tree error\n");
}
}
/* 输出所有节点中的数据 */
ret = output_tree_data();
if (ret < )
printf("output_tree_data error\n");
return ;
}
填充树后的图如下:

输出数据顺序是1、2、3、6、7、8、9、0、4、5

C语言之一般树的更多相关文章
- 2021.11.09 P2292 [HNOI2004]L语言(trie树+AC自动机)
2021.11.09 P2292 [HNOI2004]L语言(trie树+AC自动机) https://www.luogu.com.cn/problem/P2292 题意: 标点符号的出现晚于文字的出 ...
- 数据结构-C语言递归实现树的前中后序遍历
#include <stdio.h> #include <stdlib.h> typedef struct tree { int number ; struct tree *l ...
- 数据结构(C语言)关于树、二叉树、图的基本操作。
1) 编写算法函数int equal(tree t1, tree t2),判断两棵给定的树是否等价: int equal(tree t1,tree t2) { int k; if(t1==NULL&a ...
- BZOJ 1212 L语言(DP+字典树)
求能被理解的最长前缀. 很显然的dp.令dp[i]=true,表示前缀i能理解.否则不能理解.那么dp[i+len]=dp[i]=true,当s[len]能匹配str[i,i+len]. 由于模式串长 ...
- bzoj1212: [HNOI2004]L语言(字典树)
1212: [HNOI2004]L语言 题目:传送门 题解: 看完题目之后就觉得可以暴力在字典树上之间询问,一开始还傻了以为用文章来建,肯定用单词啊: 那么我们可以用一个v数组表示当前字符串1~i的区 ...
- 分类-回归树模型(CART)在R语言中的实现
分类-回归树模型(CART)在R语言中的实现 CART模型 ,即Classification And Regression Trees.它和一般回归分析类似,是用来对变量进行解释和预测的工具,也是数据 ...
- LeetCode刷题总结-树篇(中)
本篇接着<LeetCode刷题总结-树篇(上)>,讲解有关树的类型相关考点的习题,本期共收录17道题,1道简单题,10道中等题,6道困难题. 在LeetCode题库中,考察到的不同种类的树 ...
- 【深入ASP.NET原理系列】--ASP.NET页面生命周期
前言 ASP.NET页面运行时候,页面将经历一个生命周期,在生命周期中将执行一系列的处理步骤.包括初始化.实例化控件.还原和维护状态.运行时间处理程序代码以及进行呈现.熟悉页面生命周期非常重要,这样我 ...
- 【Framework】HTTP运行期与页面执行模型
HTTP运行期 HTTP运行期处理客户端应用程序(例如Web浏览器)进入的一个Web请求,通过处理它的应用程序的适当组件路由请求,然后产生响应并发回提出请求的客户端应用程序. 进入的HTTP Web请 ...
随机推荐
- mongodb数据库索引管理
1:ensureIndex() 方法 MongoDB使用 ensureIndex() 方法来创建索引. 语法 ensureIndex()方法基本语法格式如下所示: }) 语法中 Key 值为你要创建的 ...
- lnmp环境下nginx配置‘负载均衡’
NGINX负载均衡分发请求的几种方式: 1.轮询(默认)每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除.2.weight 指定轮询几率,weight和访问比率成正比 ...
- January 19 2017 Week 3 Thursday
What a man needs most is appreciated. 人性最深切的需求就是渴望别人的赞赏. Being appreciated by others is very importa ...
- macbook pro 2016 2017 15寸 雷电3 外接显卡 epu 简单教程(不修改UEFI)
雷电3外接显卡效果还不错,但是除了akitio node 其他厂家并不会维护自己的固件来适配新机型,我自己买的mbp 2016 15''就出现了和AORUS Gaming Box 1070不兼容的问题 ...
- Django 模型中FileField字段
FileField¶ class FileField([upload_to=None, max_length=100, **options])¶ 一个上传文件的字段. 注意 FileField字段不支 ...
- MS17-010复现
很早之前做的了,今天整理看到了,正好腾到blog上. ########################分割线############################## MS-17-010 攻击者向 ...
- 8.spring:事务管理(上):Spring的数据库编程、编程式事务管理
Spring的数据库编程 Spring框架提供了JDBC模板模式------>JdbcTemplate 简化了开发,在开发中并不经常是使用 实际开发更多使用的是Hibernate和MyBatis ...
- mongodb副本集优先级设置
在设置mongodb副本集时,Primary节点.second节点,仲裁节点,有可能资源配置(CPU或者内存)不均衡,所以要求某些节点不能成为Primary我们知道mongodb的设置: 除了仲裁节 ...
- Spring使用java代码配置Web.xml进行访问service
方式一:继承WebMvcConfigurerAdapter类 1.使用一个类来继承 package com.wbg.springJavaConfig.spring; import org.spring ...
- MVC学习十一:合并资源文件(BundleConfig)
在BundleConfig.cs文件下 //1.用户可以 手动 添加 js绑定对象,取一个 名字(虚拟路径),添加要绑定的JS文件 路径 bundles.Add(new ScriptBundle(&q ...