之前写了好多篇文章关于数据结构的,既然讲到了数据结构,那么就必须要说一下树,树这个数据结构使用范围非常广,应用前景广阔。

关联文章:

五分钟搞懂什么是红黑树(全程图解)

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语言实现树,你一定看得懂相关推荐

  1. C语言,谁都能看得懂的归并排序

    喜欢看排序算法动态效果的,可以看看这个网站 https://visualgo.net/zh/sorting 里面很多算法的动画解释,可以看到算法的排序效果,而且还附带了伪代码的实现过程. 本来想录制几 ...

  2. goip技术原理图解_图解电工识图一看就懂

    点击"电工电气学习"关注即可免费订阅! 图解电工识图一看就懂 出版时间:2015内容简介<图解电工识图一看就懂>采用图解的形式,系统介绍了电工识图基础知识.低压电器与电 ...

  3. 数据结构c语言版二叉树的顺序存储表示,数据结构(十一) -- C语言版 -- 树 - 二叉树基本概念...

    内容预览 零.读前说明一.二叉树相关概念1.1.定义1.2.性质1.3.满二叉树与完全二叉树1.3.1.满二叉树1.3.2.完全二叉树1.3.3.特点延伸 二.二叉树储存结构2.1.顺序结构存储2.2 ...

  4. 数据结构(十一) -- C语言版 -- 树 - 二叉树基本概念

    内容预览 零.读前说明 一.二叉树相关概念 1.1.定义 1.2.性质 1.3.满二叉树与完全二叉树 1.3.1.满二叉树 1.3.2.完全二叉树 1.3.3.特点延伸 二.二叉树储存结构 2.1.顺 ...

  5. 数据结构(十五) -- C语言版 -- 树 - 二叉树的操作进阶之创建、插入、删除、查询、销毁

    内容预览 零.读前说明 一.概述 二.数据模型分析创建 2.1.节点的结构模型 2.2.操作函数结构模型 三.创建 四.插入 4.1.在树中的某一个叶子节点位置插入新节点 4.2.在树中的某一个非叶子 ...

  6. 模拟儿童学习多语言,Deepmind让DL看视频就学会翻译

    点击上方"AI遇见机器学习",选择"星标"公众号 重磅干货,第一时间送达 来自:新智元 [导读]小孩儿是怎么学多种语言的?只通过观察,就同时掌握了不同语言.如何 ...

  7. c++ 结构体赋值_《零基础看得懂的C语言入门教程》—(十二)结构体是这么回事

    一.学习目标 了解C语言的结构体的使用方法 了解C语言结构体的结构的赋值 了解多种C语言结构体变量的赋值方法和取值方法 目录 <零基础看得懂的C语言入门教程>--(二)简单带你了解流程 & ...

  8. C语言判断树是否为求和树(附完整源码)

    C语言判断树是否为求和树 C语言判断树是否为求和树完整源码(定义,实现,main函数测试) C语言判断树是否为求和树完整源码(定义,实现,main函数测试) #include <iostream ...

  9. 为什么学习C语言这么久,看的懂代码,做不出题,写不出来项目?

    前言 我看得懂别人的程序,可是我自己却写不出来,我应该怎么办啊? 你了解这些嘛? 你只是能从别人书写的代码知道每一步都做些什么吧? 你明白别人的解题思路吗? 你知道别人为什么要用那样的算法吗? 如果你 ...

  10. b树c语言,B树——思路、及C语言代码的实现

    合并: 在此先声明,因为一开始只考虑B树的阶为4的情况,后来改为使用宏定义阶M的数值,所以这段代码存在BUG,只支持阶为3或4的B树= =. 思路还是挺清晰的,首先先向兄弟结点借元素,如果兄弟能够借给 ...

最新文章

  1. HDU 2586 How far away ? LCA ---tanjar+并查集 离线算法
  2. 华中科技大学计算机通信与网络实验,华中科技大学计算机通信与网络实验报告Socket编程实验.docx...
  3. 089_DOM节点动态创建、添加和删除
  4. matlab 工业相机 曝光时间_Matlab CCD工业相机采集图像问题 - 信息科学 - 小木虫 - 学术 科研 互动社区...
  5. 18岁学计算机专业好不好,我18岁,学计算机编程,请问有没有什么书或者方法可以提高记忆力的?...
  6. 用计算机弹奏hop,关于职称计算机Photohop模拟练习题参考
  7. 使用 ServiceStack 构建跨平台 Web 服务
  8. MATLAB imshow之后在四周加上边框
  9. php 自制建议神马收录查询工具
  10. MATLAB学习笔记(五)
  11. MySQL 取得两个时间相差的分钟数 及 常用时间函数
  12. [导入]【布鲁斯威利斯】【虎胆龙威4最终珍藏版】【1024x432RMVB 1.41GB】【20:50】...
  13. php xml 增加节点,PHP往XML中添加节点的方法_php技巧
  14. winserve2016 万能驱动网卡_Windows Server 2016中无线网卡驱动问题
  15. 常见反爬虫策略 及应对措施
  16. 计算机类公务员提升空间,本人在公务员省考裸考申论61分,在之后还有多大的提升空间?...
  17. MP3合并(MP3剪切器V2.0)
  18. 读河南干旱帖有感而发的一天(20191006)
  19. Android 文件管理器的列表界面
  20. 蓝天格锐生命环的使用方法

热门文章

  1. QtQuick controls和controls2 自定义样式
  2. mvc filter 的用法
  3. Oracle 制造死锁和查询死锁
  4. VC++ 6.0 与VS2008 C++ DEBUG工具(Windows)介绍
  5. 《网络规划设计师考试大纲》、《网络规划设计师教程》和《系统架构设计师教程》...
  6. Diango博客--23.单元测试:测试 blog 应用
  7. 《操作系统》OS学习(五):连续内存分配 内存碎片、动态分配、碎片整理、伙伴系统
  8. 面试之 Mysql 汇总
  9. scrapy框架_Python学习之Scrapy框架
  10. Python02期预科课程笔记索引