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请 ...
随机推荐
- SQL Server 2016 ->> T-SQL新特性
1) TRUNCATE表分区而不是整表 CREATE TABLE dbo.TruncatePartitionTest ( PrtCol INT, Col2 ) ) ON [myPS1](PrtCol) ...
- SQL Server ->> Natively Compiled Stored Procedures(本地编译存储过程)
Comming soon! 参考: Natively Compiled Stored Procedures
- [使用教程]cocostudio之UI编辑器动画模式
有坑! 1. 使用 (1)点击动画模式按钮,进入动画模式 (2)[关键1]左下角动作列表,右键添加动画 (3)[关键2]渲染区选择要动画的控件,右键编辑动画 * 可以看到最下面多了关键帧 (4)在右边 ...
- nest 排序
var result = client.Search<Person>(x => x.Index("personindex").Type("persont ...
- Python学习---线程基础学习
线程基础 什么是线程(thread) 线程是CPU调度能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流[换言之,线程就是一堆指令集合], ...
- 删除datatable的行后,出现“不能通过已删除的行访问该行的信息”的错误,即DeletedRowInaccessibleException
删除datatable的行后,出现“不能通过已删除的行访问该行的信息”的错误 =========================================================== 采 ...
- Hystrix请求熔断与服务降级
Hystrix请求熔断与服务降级 https://www.cnblogs.com/huangjuncong/p/9026949.html SpringCloud实战-Hystrix请求熔断与服务降级 ...
- Sql去重一些技巧
下午的时候遇到点问题,Sql去重,简单的去重可以用 DISTINCT 关键字去重,不过,很多情况下用这个解决不了问题.重复的数据千变万化,例如:类似于qq.微信的最近联系人功能,读取这些数据肯定要和消 ...
- org.openqa.selenium.WebDriverException: unknown error: missing or invalid 'entry.level'
错误原因:chrome与chromedriver版本号不匹配,升级后即可解决
- Yii2.0 请求
1.获取请求参数 $request = Yii::$app->request; $get = $request->get(); // 等价于:$get = $_GET; $id = $re ...