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 ->> 内置标量函数TRY_PARSE、TRY_CAST和TRY_CONVERT的各自特点和区别
SQL Server到了目前的2014版本有三个函数是用来转换数据格式的.虽说之前版本中已经有CAST和CONVERT这两个函数来干这个事情.问题是,一旦往目标数据类型转换失败就会造成报错. TRY_ ...
- ACM-某大牛的建议
一般要做到50行以内的程序不用调试.100行以内的二分钟内调试成功.acm主要是考算法的,主要时间是花在思考算法上,不是花在写程序与debug上. 下面给个计划你练练: 第一阶段: 练经典 ...
- PPTP vs. OpenVPN vs. L2TP/IPsec vs. SSTP
Which is the Best VPN Protocol? PPTP vs. OpenVPN vs. L2TP/IPsec vs. SSTP Want to use a VPN? If you’r ...
- error C2027: use of undefined type 'COleDispatchImpl'的解决方法
解决办法:在资源管理视图中删除CMDTARG.CPP文件,然后重新编译 设置断点后,F5调试运行,调试运行后,然后关编辑器提示保存对CMDTARG.CPP的修改,点了保存,出现error C2027: ...
- AutoHotkey调用VBA实现批量精确筛选数据透视表某字段内容。
如上图,想在数据透视表中只显示红色区域的内容,手动勾选就比较繁琐. 实现思路: 先复制红色的内容. 鼠标停留在数据透视表[型号]列的任意数据上(通过该单元格可以获取数据透视表和字段) 由于数据透视表的 ...
- js 更改对象中的属性名
const json = JSON.parse(JSON.stringify(options).replace(/name/g,"label")); 注: 1.options是需要 ...
- soapui使用。简单测试+测试套+负载测试。
http://www.cnblogs.com/zerotest/tag/soapui/
- June 30th 2017 Week 26th Friday
Love me little and love me long. 不求情意浓,但愿情意久. Some people say beautiful young people are the creatur ...
- mongodb---js脚本操作速记
之前写一些mongodb的同步或操作程序,往往使用perl,甚至c实现,这样程序很繁琐,而且逻辑不好控制,甚至一些功能和命令什么的,在这些语言的mongo驱动中就没有实现.后来发现mongodb 的s ...
- MQ7.5以后的权限问题解决
MQ7.5以后权限是个问题,目前我也没有什么特别好的解决办法,把认证通道关闭就可以正常使用. 下面是IBM 官方的解释,可惜我没调通,望高人指点! 疑问 您使用MQ 7.1或者7.5创建了一个新的队列 ...