前面几节较为详细的讨论了 linux 内核常用的链表、队列、映射等几种数据结构,本节将介绍C语言中另一种重要的数据结构——二叉搜索树(通常简称为BST),并且将一行一行写出相关的C语言代码。

二叉树的概念

树结构是一个多层的特定数据结构,每个节点之间通过指针连接(这点有些像链表),有 1 个或者 0 个入边,和 0 个或多个出边。对于二叉树,则每个节点最多只能由 2 个出边,一个典型的二叉树如下图所示。

二叉搜索树

如果二叉树的各个节点记录的数值是有序排列的,则该二叉树可称为“二叉搜索树”,它有以下三条性质:

  • 左子节点值都小于根节点值
  • 右子节点值都大于根节点值
  • 所有节点的子树也都是二叉搜索树

能够看出,二叉搜索树其实是“递归”定义的。

因此,二叉搜索树要求在插入数值时保证所有节点都是有序的,即左节点值始终小于父节点值,而右节点值始终大于父节点值。这样一来,二叉搜索树就特别适合存储需要快速检索的数据。

使用C语言描述二叉搜索树

在 C语言中,常常用指针连接二叉树的各个节点,这就和链表很像,所以可以用如下结构体来描述一个二叉树,请看:

typedef struct __BINTREE{ struct __BINTREE* left; struct __BINTREE* right; int data;}BINTREE;

BINTREE 结构体非常简单,它有 left 和 right 两个指针,分别指向它的左右两个子节点,还有一个 data 成员用于记录数值。

将数值插入二叉搜索树

现在知道了二叉树的数据结构(BINTREE结构体),如果我想将某个数值插入二叉树,并且还要使其满足“二叉搜索树”的三条性质,该怎样编写C语言代码呢?

前面提到,二叉搜索树的三条性质其实是递归定义的,那么使用C语言的递归函数也就非常容易实现,请看:

int insert_node(BINTREE** pptree, int value){ if(NULL==(*pptree)){ (*pptree) = (BINTREE*)malloc(sizeof(BINTREE)); if(NULL==(*pptree)){ printf("insert %d failed for malloc failed

c语言二叉树_linux学习第20节,二叉树的特性和插入、查询、删除等基本操作相关推荐

  1. c语言链表的插入 查询 删除

    c语言实验十五链表 链表的插入 查询 删除, 不会吧,来看看月腾兄的: #include<stdio.h> #include<stdlib.h> struct node {in ...

  2. python的turtle怎么画曲线_python学习第20节:Turtle海龟绘图

    一.Turtle绘图 1.1.画一条线 如何让这只乌龟在界面上画一条线呢?如同我们用笔写字一样,需要经过"落笔"."划过"."抬笔".&qu ...

  3. excel 进行二叉树_基础扩展 | 20. 建立二叉树

    学习Excel技术,关注微信公众号: excelperfect 先看看下图1所示的一棵完全二叉树,图中标出了结点的内容.结点编号以及上下层子树之间的关系. 图1 可以看出,如果我们将根结点编号为1,下 ...

  4. C语言数据结构 单链表的建立、遍历、查找、插入和删除操作

    参考文献 本博文为半摘记性质 -- 声明:全文主干部分摘自 [1] 杨智明. 数据结构(C语言版)[M]. 第一版. 北京:北京理工大学出版社, 2016. [2] 严蔚敏, 李冬梅, 吴伟民. 数据 ...

  5. 《从零开始学Swift》学习笔记(Day 14)——字符串的插入、删除和替换

    原创文章,欢迎转载.转载请注明:关东升的博客 对应可变字符串可以插入.删除和替换,String提供了几个方法可以帮助实现这些操作.这些方法如下: splice(_:atIndex:).在索引位置插入字 ...

  6. 6-8 Percolate Up and Down (20 分)【堆结点的插入与删除】

    堆节点的插入: void PercolateUp( int p, PriorityQueue H ){ //插入时,小的数字向上调整int i;int temp=H->Elements[p];f ...

  7. 《C语言及程序设计》教学视频 18 链表中结点的插入和删除 示例代码

    2017-05-02 //插入新建节点 #include <stdio.h> #include <malloc.h>typedef struct Link{int data;s ...

  8. c语言删除文件中的结构体_C语言插入、删除、更改文件内容

    我们平时所见的文件,例如 txt.doc.mp4 等,文件内容是按照从头到尾的顺序依次存储在磁盘上的,就像排起一条长长的队伍,称为顺序文件. 除了顺序文件,还有索引文件.散列文件等,一般用于特殊领域, ...

  9. 第十一章 文件操作_C语言插入、删除、更改文件内容

    我们平时所见的文件,例如 txt.doc.mp4 等,文件内容是按照从头到尾的顺序依次存储在磁盘上的,就像排起一条长长的队伍,称为顺序文件. 除了顺序文件,还有索引文件.散列文件等,一般用于特殊领域, ...

最新文章

  1. 3D目标检测深度学习方法中voxel-represetnation内容综述(三)
  2. 应用人工智能有助心理学发展
  3. Oracle Execute Plan原理分析与实例分享之一
  4. 微型计算机的典型应用场景,单片机有哪些类型和应用场景?-MCU解决方案
  5. 中国硫酸氧钒市场发展战略与投资可行性分析报告2022-2028年版
  6. 快速了解 ASP.NET Core Blazor
  7. day29 socket编程TCP和UDP
  8. tms320c2000 c语言伪指令,TMS320F240XDSP汇编及C语言多功能控制应用(附光盘)
  9. 转: 加快Android编译速度
  10. nodejs mysql事务处理_关于NodeJs如何使用Mysql模块实现事务处理实例
  11. Docker学习总结(12)——非常详细的 Docker 学习笔记
  12. 浅谈Dubbo服务引入源码(@ReferenceBean依赖注入)
  13. y7000p屏幕亮度低_联想拯救者y7000p怎么样 评测结果揭晓屏幕优点
  14. 在CSDN发布付费资源
  15. vulcan 编程_Vulcan和AUSK之间的比较:如何充分利用Node,React和GraphQL
  16. 利用python解决简单数独
  17. 【C++】C++PrimerPlus(第6版)中文版 第9章 内存模型和名称空间 编程练习 参考答案
  18. 大学物理-震动波动光学
  19. UE4项目开启光线追踪
  20. vtk 显示效果设置

热门文章

  1. java游戏有牧师_JAVA内部类是怎么玩儿的
  2. Codeforce 记录 Rating
  3. Intouch和S7300连接 DAServer分组 SMC驱动备份
  4. 12306小卡片-鸿蒙智慧出行
  5. html5自由者,排球自由人可以一直不下场吗?就是可不可以一直在后排轮换?
  6. pytorch tensor数据类型与变换类型
  7. pandas插入新列
  8. 考研数学自整理,弥补知识漏洞(强化、冲刺)
  9. 计算机的发展英语600词,程序员必备的600个英语词汇
  10. pyspark 读取csv文件创建DataFrame的两种方法