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语言之一般树的更多相关文章

  1. 2021.11.09 P2292 [HNOI2004]L语言(trie树+AC自动机)

    2021.11.09 P2292 [HNOI2004]L语言(trie树+AC自动机) https://www.luogu.com.cn/problem/P2292 题意: 标点符号的出现晚于文字的出 ...

  2. 数据结构-C语言递归实现树的前中后序遍历

    #include <stdio.h> #include <stdlib.h> typedef struct tree { int number ; struct tree *l ...

  3. 数据结构(C语言)关于树、二叉树、图的基本操作。

    1) 编写算法函数int equal(tree t1, tree t2),判断两棵给定的树是否等价: int equal(tree t1,tree t2) { int k; if(t1==NULL&a ...

  4. BZOJ 1212 L语言(DP+字典树)

    求能被理解的最长前缀. 很显然的dp.令dp[i]=true,表示前缀i能理解.否则不能理解.那么dp[i+len]=dp[i]=true,当s[len]能匹配str[i,i+len]. 由于模式串长 ...

  5. bzoj1212: [HNOI2004]L语言(字典树)

    1212: [HNOI2004]L语言 题目:传送门 题解: 看完题目之后就觉得可以暴力在字典树上之间询问,一开始还傻了以为用文章来建,肯定用单词啊: 那么我们可以用一个v数组表示当前字符串1~i的区 ...

  6. 分类-回归树模型(CART)在R语言中的实现

    分类-回归树模型(CART)在R语言中的实现 CART模型 ,即Classification And Regression Trees.它和一般回归分析类似,是用来对变量进行解释和预测的工具,也是数据 ...

  7. LeetCode刷题总结-树篇(中)

    本篇接着<LeetCode刷题总结-树篇(上)>,讲解有关树的类型相关考点的习题,本期共收录17道题,1道简单题,10道中等题,6道困难题. 在LeetCode题库中,考察到的不同种类的树 ...

  8. 【深入ASP.NET原理系列】--ASP.NET页面生命周期

    前言 ASP.NET页面运行时候,页面将经历一个生命周期,在生命周期中将执行一系列的处理步骤.包括初始化.实例化控件.还原和维护状态.运行时间处理程序代码以及进行呈现.熟悉页面生命周期非常重要,这样我 ...

  9. 【Framework】HTTP运行期与页面执行模型

    HTTP运行期 HTTP运行期处理客户端应用程序(例如Web浏览器)进入的一个Web请求,通过处理它的应用程序的适当组件路由请求,然后产生响应并发回提出请求的客户端应用程序. 进入的HTTP Web请 ...

随机推荐

  1. Linux中redis的安装与配置

    redis官网地址:http://www.redis.io/ redis安装 在Linux下安装Redis非常简单,这里以2.8.3版本为例,具体步骤如下: 1.下载源码,解压缩后编译源码. $ mk ...

  2. base64编码加密图片和展示图片

    base64是当前网络上最为常见的传输8Bit字节代码的编码方式其中之一.base64主要不是加密,它主要的用途是把某些二进制数转成普通字符用于 网络传输.由于这些二进制字符在传输协议中属于控制字符, ...

  3. 为什么说 Java 程序员必须掌握 Spring Boot ?

    原作者https://www.cnblogs.com/ityouknow/p/9175980.html Spring Boot 2.0 的推出又激起了一阵学习 Spring Boot 热,就单从我个人 ...

  4. [原]如何在Android用FFmpeg+SDL2.0之同步音频

    同步音频的原理可以参考:http://dranger.com/ffmpeg/tutorial05.html  本文是在 [原]如何在Android用FFmpeg+SDL2.0之同步视频 的基础上面继续 ...

  5. D3——散点图Scatterplot

    散点图 //Width and height ; ; ; var dataset = [ [, ], [, ], [, ], [, ], [, ], [, ], [, ], [, ], [, ], [ ...

  6. JavaScript的DOM_获取和操作层次节点

    一.层次节点的概述 节点的层次结构可以划分为:父节点与子节点.兄弟节点这两种.当我们获取其中一个元素节点的时候,就可以使用层次节点属性来获取它相关层次的节点. 二.childNodes 属性 chil ...

  7. [19/04/06-星期六] 多线程_静态代理(StaticProxy)和 lamda (简化代码,jdk8新增)

    一.静态代理 [代码示例] /*** * 静态代理:记录日志等,类是写好的,直接拿来用. 动态代理:随用随构建,临时抱佛脚 * 婚庆公司:代理角色,帮你搞婚庆的一切,布置房间等等 * 自己:真实角色, ...

  8. Selenium基础知识(详解IDE命令、css及xpath定位一)

    1. ide常用命令,参考 http://sariyalee.iteye.com/blog/1743350  2. ide介绍,参考 http://blog.csdn.net/oscar999/art ...

  9. jquery特效 点击某项,其它隐藏

    <html> <head> </head> <body> <script> $(function(){ $(".cPage a&q ...

  10. js中两个日期大小比较,获取当前日期,日期加减一天

    一.两个日期大小比较 1.日期参数格式:yyyy-mm-dd // a: 日期a, b: 日期b, flag: 返回的结果 function duibi(a, b,flag) { var arr = ...