C语言实现树,你一定看得懂
之前写了好多篇文章关于数据结构的,既然讲到了数据结构,那么就必须要说一下树,树这个数据结构使用范围非常广,应用前景广阔。
关联文章:
五分钟搞懂什么是红黑树(全程图解)
Linux 内核红黑树分析
这篇文章主要是讲解最简单的一个树的构成,并用代码实现。
声明节点结构体
/*树节点*/typedef struct node{ int data; struct node * left; /*节点左边的树枝*/ struct node * right;/*节点右边的树枝*/}Node;
data 是这个节点的数据,left是这个节点指向左边节点的指针,right 是指向右边节点的指针。
声明根节点结构体
/*树根*/typedef struct tree{ Node * root;}Tree;
根节点也是一个节点,只不过这个节点代表了这棵树,这个节点存在,就代表这棵树没有死。
定义一个根节点
Tree tree; tree.root = NULL;/*创建一个空树*/
像节点插入一个数据
我们现在模拟一下,插入一个数据 5
/*插入函数 向一个树里面插入数据*/void insert(Tree* tree, int value){ /*创建一个节点*/ Node* node=(Node*)malloc(sizeof(Node)); node->data = value; node->left = NULL; node->right = NULL;
/*判断树是不是空树*/ if (tree->root == NULL) { tree->root = node; } //.......}
我们会先判断 这个树是不是空的,如果是空的,就把这树根指向这个 node 节点。
我们再插入一个数据 4
因为 4 小于 5,所以我们需要把 4插入到 5 的左边节点去。
insert(&tree, temp);
所以就变成这样
我们再插入一个数据 3
因为 3 小于 4,那我们就再插入到4的left节点。
如果我们再插入一个 5呢?
大于等于 当前节点的,都进入right节点,所以,插入 5 会变成这样。
遍历一棵树
遍历一棵树的方法有很多,前序遍历,中序遍历,后序遍历,我这里就不说了,无非就是递归判断节点是否为空,我这里使用的是中序遍历。
/* 遍历一整颗树 中序遍历:先左后根再右 */void traverse(Node* node){ if(node != NULL) { traverse(node->left); printf("%d ",node->data); traverse(node->right); }}
traverse(node->left); 递归扫描所有的左子树节点 traverse(node->right); 递归扫描所有的右子树节点
销毁一棵树
既然我们是通过 malloc 来创建一棵树的,那么使用完后,肯定需要释放内存,要不然内存就会一直消耗占用。
/*销毁一棵树*/void distory_tree(Node* node){
if(node != NULL) { distory_tree(node->left); distory_tree(node->right); printf("free node:%d\n",node->data); free(node); node = NULL; }}
使用递归很爽啊,一直使用一直爽啊。哈哈,那就一直使用递归好了。
完整代码
#include "stdio.h"#include "stdlib.h"
/*树节点*/typedef struct node{ int data; struct node * left; /*节点左边的树枝*/ struct node * right;/*节点右边的树枝*/}Node;
/*树根*/typedef struct tree{ Node * root;}Tree;
/*插入函数 向一个树里面插入数据*/void insert(Tree* tree, int value){ /*创建一个节点*/ Node* node=(Node*)malloc(sizeof(Node)); node->data = value; node->left = NULL; node->right = NULL;
/*判断树是不是空树*/ if (tree->root == NULL) { tree->root = node; } else /*不是空树*/ { Node* temp = tree->root;/*从树根开始*/ while (temp != NULL) { if(value < temp->data)/*小于就进左儿子*/ { if(temp->left == NULL) { temp->left = node; return; } else /*继续判断*/ { temp = temp->left; } } else /*否则进右儿子*/ {
if(temp->right == NULL) { temp->right = node; return; } else /*继续判断*/ { temp = temp->right; } } } }}
/* 遍历一整颗树 中序遍历:先左后根再右 */void traverse(Node* node){ if(node != NULL) { traverse(node->left); printf("%d ",node->data); traverse(node->right); }}
/*销毁一棵树*/void distory_tree(Node* node){
if(node != NULL) { distory_tree(node->left); distory_tree(node->right); printf("free node:%d\n",node->data); free(node); node = NULL; }}
/*主函数*/int main(){ int i = 0; Tree tree; tree.root = NULL;/*创建一个空树*/ int n; printf("input total num:\n"); /*输入n个数并创建这个树*/ scanf("%d",&n); for(i = 0; i < n; i++) { int temp; scanf("%d",&temp); insert(&tree, temp); } /*遍历整个树*/ traverse(tree.root);
/*销毁一棵树*/ distory_tree(tree.root); return 0;}
总结
数据结构里的树是一个难点和重点,变化也非常多,我们安卓系统里面的跨进程间通信,使用的binder,底层就是有使用到红黑树,大家如果通过这个小例子知道树这个概念,以后遇到就不至于一愣一愣的。
好吧,就说这么多,文章有问题的,欢迎批评指正,我们要在批评与指正中成长,觉得不错的,感谢转发和再看。
共勉~
—————END—————
C语言实现树,你一定看得懂相关推荐
- C语言,谁都能看得懂的归并排序
喜欢看排序算法动态效果的,可以看看这个网站 https://visualgo.net/zh/sorting 里面很多算法的动画解释,可以看到算法的排序效果,而且还附带了伪代码的实现过程. 本来想录制几 ...
- goip技术原理图解_图解电工识图一看就懂
点击"电工电气学习"关注即可免费订阅! 图解电工识图一看就懂 出版时间:2015内容简介<图解电工识图一看就懂>采用图解的形式,系统介绍了电工识图基础知识.低压电器与电 ...
- 数据结构c语言版二叉树的顺序存储表示,数据结构(十一) -- C语言版 -- 树 - 二叉树基本概念...
内容预览 零.读前说明一.二叉树相关概念1.1.定义1.2.性质1.3.满二叉树与完全二叉树1.3.1.满二叉树1.3.2.完全二叉树1.3.3.特点延伸 二.二叉树储存结构2.1.顺序结构存储2.2 ...
- 数据结构(十一) -- C语言版 -- 树 - 二叉树基本概念
内容预览 零.读前说明 一.二叉树相关概念 1.1.定义 1.2.性质 1.3.满二叉树与完全二叉树 1.3.1.满二叉树 1.3.2.完全二叉树 1.3.3.特点延伸 二.二叉树储存结构 2.1.顺 ...
- 数据结构(十五) -- C语言版 -- 树 - 二叉树的操作进阶之创建、插入、删除、查询、销毁
内容预览 零.读前说明 一.概述 二.数据模型分析创建 2.1.节点的结构模型 2.2.操作函数结构模型 三.创建 四.插入 4.1.在树中的某一个叶子节点位置插入新节点 4.2.在树中的某一个非叶子 ...
- 模拟儿童学习多语言,Deepmind让DL看视频就学会翻译
点击上方"AI遇见机器学习",选择"星标"公众号 重磅干货,第一时间送达 来自:新智元 [导读]小孩儿是怎么学多种语言的?只通过观察,就同时掌握了不同语言.如何 ...
- c++ 结构体赋值_《零基础看得懂的C语言入门教程》—(十二)结构体是这么回事
一.学习目标 了解C语言的结构体的使用方法 了解C语言结构体的结构的赋值 了解多种C语言结构体变量的赋值方法和取值方法 目录 <零基础看得懂的C语言入门教程>--(二)简单带你了解流程 & ...
- C语言判断树是否为求和树(附完整源码)
C语言判断树是否为求和树 C语言判断树是否为求和树完整源码(定义,实现,main函数测试) C语言判断树是否为求和树完整源码(定义,实现,main函数测试) #include <iostream ...
- 为什么学习C语言这么久,看的懂代码,做不出题,写不出来项目?
前言 我看得懂别人的程序,可是我自己却写不出来,我应该怎么办啊? 你了解这些嘛? 你只是能从别人书写的代码知道每一步都做些什么吧? 你明白别人的解题思路吗? 你知道别人为什么要用那样的算法吗? 如果你 ...
- b树c语言,B树——思路、及C语言代码的实现
合并: 在此先声明,因为一开始只考虑B树的阶为4的情况,后来改为使用宏定义阶M的数值,所以这段代码存在BUG,只支持阶为3或4的B树= =. 思路还是挺清晰的,首先先向兄弟结点借元素,如果兄弟能够借给 ...
最新文章
- HDU 2586 How far away ? LCA ---tanjar+并查集 离线算法
- 华中科技大学计算机通信与网络实验,华中科技大学计算机通信与网络实验报告Socket编程实验.docx...
- 089_DOM节点动态创建、添加和删除
- matlab 工业相机 曝光时间_Matlab CCD工业相机采集图像问题 - 信息科学 - 小木虫 - 学术 科研 互动社区...
- 18岁学计算机专业好不好,我18岁,学计算机编程,请问有没有什么书或者方法可以提高记忆力的?...
- 用计算机弹奏hop,关于职称计算机Photohop模拟练习题参考
- 使用 ServiceStack 构建跨平台 Web 服务
- MATLAB imshow之后在四周加上边框
- php 自制建议神马收录查询工具
- MATLAB学习笔记(五)
- MySQL 取得两个时间相差的分钟数 及 常用时间函数
- [导入]【布鲁斯威利斯】【虎胆龙威4最终珍藏版】【1024x432RMVB 1.41GB】【20:50】...
- php xml 增加节点,PHP往XML中添加节点的方法_php技巧
- winserve2016 万能驱动网卡_Windows Server 2016中无线网卡驱动问题
- 常见反爬虫策略 及应对措施
- 计算机类公务员提升空间,本人在公务员省考裸考申论61分,在之后还有多大的提升空间?...
- MP3合并(MP3剪切器V2.0)
- 读河南干旱帖有感而发的一天(20191006)
- Android 文件管理器的列表界面
- 蓝天格锐生命环的使用方法
热门文章
- QtQuick controls和controls2 自定义样式
- mvc filter 的用法
- Oracle 制造死锁和查询死锁
- VC++ 6.0 与VS2008 C++ DEBUG工具(Windows)介绍
- 《网络规划设计师考试大纲》、《网络规划设计师教程》和《系统架构设计师教程》...
- Diango博客--23.单元测试:测试 blog 应用
- 《操作系统》OS学习(五):连续内存分配 内存碎片、动态分配、碎片整理、伙伴系统
- 面试之 Mysql 汇总
- scrapy框架_Python学习之Scrapy框架
- Python02期预科课程笔记索引