创作

完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>

3天内不再提示

C语言数据结构:什么是二叉树?

Rgiv_cyuyanxuex 来源:C语言编程学习基地 作者:C语言编程学习基地 2022-04-21 16:20 次阅读

在二叉树之前的数据结构学习中,我们学习了顺序表、链表、栈、队列这几种结构,它们都是用链表或者数组的方式来实现的,主要考察我们对结构体的运用!

今天让我们来学习一个新的数据结构,也就是下面这副图里面的树

是下面这个才对

6381ab7c-bef0-11ec-9e50-dac502259ad0.png

1.什么是树?

1.1树的概念

树是一种非线性的数据结构,它是由n个有限节点组成的具有一定层次关系的集合。

把它叫做树是因为它看起来的确像一个树的根部

当然也可以理解为是树干在上,树叶在下的结构

有一个特殊的节点,被称为根节点,也就是树的开头

除了根节点外,其余节点都是,个互不相交的集合。每一个集合都是一颗与树的结构类似的子树

每一个节点只能有一个前驱,但是可以有很多个后驱

因此,树是递归定义的

639b8704-bef0-11ec-9e50-dac502259ad0.png

树中的子节点不能有交集

上图中的B节点不能有G这个孩子,因为G已经有父母C了

同理,G节点也不能同时拥有两对父母

子节点之间也不能相连,如E和F不能相连

1.2树的相关知识点

63b1578c-bef0-11ec-9e50-dac502259ad0.png

节点的度:一个节点含有的子树的个数称为该节点的度;如下图:A的度为6

63c8d9d4-bef0-11ec-9e50-dac502259ad0.png

叶节点或终端节点:度为0的节点称为叶节点;图中B、C、H、I…等节点为叶节点

非终端节点或分支节点:度不为0的节点;如上图中D、E、F、G…等节点为分支节点

简单的说,就是有娃的节点就是分支节点

63e73fc8-bef0-11ec-9e50-dac502259ad0.png

双亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点;如上图,D是H的父节点

孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点;如上图:H是D的孩子节点

兄弟节点:具有相同父节点的节点互称为兄弟节点;如下图:P、Q是兄弟节点

63f527dc-bef0-11ec-9e50-dac502259ad0.png

树的度:一棵树中,最大的节点的度称为树的度;示例中树的度为6(即A的度)

节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推

树的高度或深度:树中节点的最大层次;示例中树的高度为4

堂兄弟节点:双亲在同一层的节点互为堂兄弟;如下图:H、I互为兄弟节点

64104e86-bef0-11ec-9e50-dac502259ad0.png

节点的祖先:从根到该节点所经分支上的所有节点;示例中A是所有节点的祖先

子孙:以某节点为根的子树中任一节点都称为该节点的子孙。示例中所有节点都是A的子孙

森林:由m(m>0)棵互不相交的树的集合称为森林

多个不相交的树就是森林

642ad6b6-bef0-11ec-9e50-dac502259ad0.png

1.3树的代码表示

表示树的方式有很多种,比如下面这种

#define N 5 //指定树的度为5struct TreeNode{ int data; struct TreeNode* subs[N];//用指针数组存放孩子节点的指针};

但这种方法不够优,给大家展示一个用的最广泛的方法——孩子兄弟表示法

typedef int DataType;struct Node{ struct Node* _firstChild1; // 第一个孩子结点 struct Node* _pNextBrother; // 指向其下一个兄弟结点 DataType _data; // 结点中的数据域};

通过这种方法,父亲节点只需要保存它的第一个娃,其他娃就让大娃的兄弟节点来找

也就是家长只用管老大,老大管老二,老二管老三,依次往下……

643d046c-bef0-11ec-9e50-dac502259ad0.png

实际写代码的结构大概是下图这样

64553d98-bef0-11ec-9e50-dac502259ad0.png

2.二叉树

在实际中,二叉树是使用较多的一种树的结构

2.1概念

二叉树是度为2的树,它是一个特殊的树

二叉树不存在度大于2的节点

二叉树是有序树,它的娃(子树)有左右之分,次序不能颠倒

6472e686-bef0-11ec-9e50-dac502259ad0.png

所以,二叉树都是由下面各类节点组成的树

6499d4ee-bef0-11ec-9e50-dac502259ad0.png

2.2特殊的二叉树

满二叉树:如果每一个层的节点数都达到最大值,那这个二叉树就是满二叉树。也就是说:满二叉树的层数为k,且节点总数是2k-1

满二叉树的节点数是一个等比数列公式

2 0 + 2 1 + 2 2 + . . . + 2 k − 1 = 1 ∗ ( 1 − 2 k ) / ( 1 − 2 ) = 2 k − 1 2^0+2^1+2^2+...+2^{k-1}=1*(1-2^k)/(1-2)=2^k -1 20+21+22+...+2k−1=1∗(1−2k)/(1−2)=2k−1

完全二叉树:完全二叉树是效率很高的数据结构。对于深度为K,有n个节点的二叉树,当且仅当每一个节点都与深度为K的满二叉树中编号从1至n的节点一一对应时,称为完全二叉树。

64ae460e-bef0-11ec-9e50-dac502259ad0.png

简单说来,完全二叉树的最后一层不一定满,但必须要从左到右连续

64d14384-bef0-11ec-9e50-dac502259ad0.png

满二叉树是一个特殊的完全二叉树

2.3二叉树的性质

若规定根节点的层数为1,则一棵非空二叉树的第i层上最多有2(i-1)个结点

若规定根节点的层数为1,则深度为h的二叉树的最大结点数是2h-1

对任何一棵二叉树, 如果度为0其叶结点个数为n0, 度为2的分支结点个数为n2,则有n0 = n2+1

若规定根节点的层数为1,具有n个结点的满二叉树的深度,h=log2(n+1) 。(ps:是log以2为底,n+1为对数)

对于具有n个结点的完全二叉树,如果按照从上至下从左至右的数组顺序对所有节点从0开始编号,则对于序号为i的结点有:

若i>0,i位置节点的双亲序号:(i-1)/2;i=0,i为根节点编号,无双亲节点

若2i+1=n否则无左孩子

若2i+2=n否则无右孩子

2.4几个选择题

1. 某二叉树共有 399 个结点,其中有 199 个度为 2 的结点,则该二叉树中的叶子结点数为( )

A 不存在这样的二叉树

B 200 √

C 198

D 199

//叶子节点的数量 总比度为2的节点多1

2.在具有 2n 个结点的完全二叉树中,叶子结点个数为( )

A n √

B n+1

C n-1

D n/2

//N0+N1+N2=2n

//2N0+N1-1=2n

//N1只有0和1两种可能,因为n为整数,2n为偶数,所以2N0=2n,N0=n

3.一棵完全二叉树的节点数位为531个,那么这棵树的高度为( )

A 11

B 10 √

C 8

D 12

//假设高度是h

//完全二叉树节点最多2^h -1

// 最少2^(h-1)-1 +1

//可以通过这两个公式,推断出h=10

3.二叉树的存储结构

二叉树一般可以使用两种结构存储,一种顺序结构,一种链式结构

3.1顺序存储

顺序结构存储就是使用数组来存储

一般使用数组只适合表示完全二叉树,因为不是完全二叉树会有空间的浪费。

现实使用中只有堆才会使用数组来存储

下一篇博客会带大家认识堆这个特殊的树形结构(和内存里面那个堆????没啥关系哈)

65101f1e-bef0-11ec-9e50-dac502259ad0.png

看到这张图,你肯定想问,如果用数组结构存储,那还怎么还原出一颗树????呢?

这里我们需要理解物理存储和逻辑结构的关系

二叉树顺序存储在物理上是一个数组,在逻辑上是一颗二叉树

那怎么计算这种情况下的父亲和娃呢?

leftchild=parent*2+1

rightchild=parent*2+2

parent=(child-1)/2

6530a02c-bef0-11ec-9e50-dac502259ad0.png

怎么样,是不是忽然感觉妙级了?

3.2链式存储

这就就没啥好说的啦,使用一个简单的二叉链就能构成二叉树

typedef int BTDataType;// 二叉链struct BinaryTreeNode{ struct BinTreeNode* _pLeft; // 指向当前节点左孩子 struct BinTreeNode* _pRight; // 指向当前节点右孩子 BTDataType _data; // 当前节点的值}

审核编辑 :李倩

  • C语言
    +关注

    关注

    165

    文章

    5914

    浏览量

    111280
  • 数据结构
    +关注

    关注

    3

    文章

    338

    浏览量

    38105
  • 二叉树
    +关注

    关注

    0

    文章

    43

    浏览量

    11074
收藏 人收藏

    评论

    相关推荐

    C语言编程规范 ISO/IEC 9899:1999

    C语言编程规范,ISO/IEC 9899:1999
    发表于 06-27 15:13 6次 阅读

    XHRadarView iOS仿雷达扫描界面

    ./oschina_soft/XHRadarView.zip
    发表于 06-27 09:55 6次 阅读
    XHRadarView iOS仿雷达扫描界面

    关于C#课程总结

    利用C#语言,我第一次设计成功一个窗体程序,这使我充满继续学习C#的兴趣。随着课程的深入,我越发感觉....
    发表于 06-23 15:14 8次 阅读

    gft4c生成函数声明列表工具

    ./oschina_soft/gft4c.zip
    发表于 06-23 14:50 10次 阅读
    gft4c生成函数声明列表工具

    Tinn C语言实现的微型神经网络库

    ./oschina_soft/tinn.zip
    发表于 06-23 14:40 6次 阅读
    Tinn C语言实现的微型神经网络库

    open62541 OPC UA规范的C语言实现

    ./oschina_soft/open62541.zip
    发表于 06-23 10:14 11次 阅读
    open62541 OPC UA规范的C语言实现

    C语言的具体结构与基本数据类型

    简单来说,一个C程序就是由若干头文件和函数组成。
    的头像 STM32嵌入式开发 发表于 06-22 15:35 207次 阅读

    安富莱C语言编码规范

    以下提供两种命名方式以供参考:(1)各程序模块的文件命名开头 2 个小写字母代表本模块的功能:如:主....
    的头像 硬件攻城狮 发表于 06-22 14:38 129次 阅读

    fastcxml xml解析库

    ./oschina_soft/gitee-fastxm<x>l.zip
    发表于 06-22 10:31 10次 阅读
    fastcxml xml解析库

    C语言的面向接口编程

    其实bug菌这么多年开发过来,真正把C完完全全用面向对象的方式进行编写是非常少的,像C++中的继承、....
    的头像 FPGA之家 发表于 06-22 09:37 110次 阅读

    AWTK-MVVM C语言MVVM框架

    ./oschina_soft/gitee-awtk-mvvm.zip
    发表于 06-21 11:33 7次 阅读
    AWTK-MVVM C语言MVVM框架

    开源软件-Libcsp高性能C语言并发库

    ./oschina_soft/libcsp.zip
    发表于 06-21 10:35 9次 阅读
    开源软件-Libcsp高性能C语言并发库

    如何利用C语言去调用rust静态库呢

    引言 工作中的嵌入式项目,基本都是C语言。 一直想在项目中引入一个略高级的语言,来填补C语言的一些不足。 之前有用过Mic...
    发表于 06-21 10:27 847次 阅读

    在rust中调用C语言并实现字符串打印

    上篇实现了C调用rust。 此篇计划实现在rust中调用c,并实现字符串打印。 更新lib.rs extern "C" { fn test_putcha...
    发表于 06-21 10:20 821次 阅读

    LIB-ZO C语言协程库

    ./oschina_soft/gitee-lib-zo.zip
    发表于 06-21 10:05 3次 阅读
    LIB-ZO C语言协程库

    libspng PNG图片读写库

    ./oschina_soft/libspng.zip
    发表于 06-21 09:41 3次 阅读
    libspng PNG图片读写库

    C语言和C++到底是什么关系

    首先C++和C语言本来就是两种不同的编程语言,但C++确实是对C语言的扩充和延伸,并且对C语言提供后....
    的头像 一口Linux 发表于 06-20 11:28 133次 阅读

    如何解决并发 C 应用程序中的多线程问题

    本文描述如何使用 C 编程语言和标准 POSIX 线程。 使用互斥锁和信号量管理并发访问 如前所述,并发写入操作可能会导致...
    发表于 06-20 09:58 2362次 阅读
    如何解决并发 C 应用程序中的多线程问题

    嵌入式软件设计模式 好文值得收藏

    本文引用自本人公众号文章: 嵌入式开发中的两点编程思想   C语言也很讲究设计模式?一文讲透   包....
    的头像 lucky的记录与分享 发表于 06-20 09:09 194次 阅读

    C语言实现txt文本读取与修改

    #include #include #include int main(){FILE *fp = f....
    的头像 嵌入式应用开发 发表于 06-17 17:06 552次 阅读
    C语言实现txt文本读取与修改

    c语言实现一元线性回归

    第一:用所给样本求出两个相关变量的(算术)平均值 第二:分别计算分子和分母:(两个公式任选其一)分子....
    的头像 嵌入式应用开发 发表于 06-17 16:16 355次 阅读
    c语言实现一元线性回归

    C语言怎么跳出while函数

    在C语言中while函数是经常用到的,这里说一下可以跳出while函数的几种方法。
    的头像 嵌入式应用开发 发表于 06-17 15:40 231次 阅读
    C语言怎么跳出while函数

    cpufetch CPU信息获取命令行工具

    ./oschina_soft/cpufetch.zip
    发表于 06-17 15:02 21次 阅读
    cpufetch CPU信息获取命令行工具

    怎样用C语言去启动SOC验证环境呢

    上次说到CPU的boot,今天说说SOC环境的另外一种启动方式。用C启动SOC验证环境有几个问题。 一是CPU boot过程比较慢...
    发表于 06-17 14:41 704次 阅读

    SameBoy开源的Game Boy模拟器

    ./oschina_soft/SameBoy.zip
    发表于 06-17 11:28 9次 阅读
    SameBoy开源的Game Boy模拟器

    cwb C语言网络框架

    ./oschina_soft/gitee-cwb.zip
    发表于 06-17 10:20 99次 阅读
    cwb C语言网络框架

    ccls C/C++/ObjC语言服务器

    ./oschina_soft/ccls.zip
    发表于 06-17 09:32 14次 阅读
    ccls C/C++/ObjC语言服务器

    C语言如何注释以及在哪儿注释

    文件注释描述了该文件的内容,如果一个文件只声明,或实现,或测试了一个对象,并且这个对象已经在它的声明....
    的头像 strongerHuang 发表于 06-17 09:22 174次 阅读

    C语言指针相关的概念、语法及使用场景

    如果问C语言中最重要、威力最大的概念是什么,答案必将是指针!威力大,意味着使用方便、高效,同时也意味....
    的头像 硬件攻城狮 发表于 06-16 15:59 331次 阅读

    怎样去设计ARM Linux系统下的c语言程序呢

    正所谓:工欲善其事必先利其器 开发环境ip地址配置如下:windows工作主机地址为:192.168.1.101 linux宿主机 eth0 ip地址为19...
    发表于 06-16 14:48 548次 阅读

    常用优化编译选项对ARM平台的影响

    我们知道在C语言编译时,有那么几个常用的优化编译选项,分别是-O0,-O1,-O2,-O3以及-Os。之前一直觉得既然是优化选项,顶多...
    发表于 06-16 14:38 468次 阅读

    Cmark C版本Markdown解析器

    ./oschina_soft/cmark.zip
    发表于 06-16 14:24 8次 阅读
    Cmark C版本Markdown解析器

    Littlewolf C语言编写的图形引擎

    ./oschina_soft/littlewolf.zip
    发表于 06-16 14:23 10次 阅读
    Littlewolf C语言编写的图形引擎

    MiniLisp Lisp解释器

    ./oschina_soft/minilisp.zip
    发表于 06-16 11:57 6次 阅读
    MiniLisp Lisp解释器

    MuJoCo多关节动力学物理引擎

    ./oschina_soft/mujoco.zip
    发表于 06-16 10:56 14次 阅读
    MuJoCo多关节动力学物理引擎

    space-shooter.c 2D太空射击游戏

    ./oschina_soft/space-shooter.c.zip
    发表于 06-16 10:31 8次 阅读
    space-shooter.c 2D太空射击游戏

    Arb任意精度区间算法C库

    ./oschina_soft/arb.zip
    发表于 06-16 10:25 9次 阅读
    Arb任意精度区间算法C库

    Assimp 3D模型导入库

    ./oschina_soft/assimp.zip
    发表于 06-16 09:53 13次 阅读
    Assimp 3D模型导入库

    从数据结构和算法解析OpenHarmony的事件机制

    近年来,国内开源实现跨越式发展,并成为企业提升创新能力、生产力、协作和透明度的关键。作为 OpenA....
    的头像 OpenAtom OpenHarmony 发表于 06-16 09:46 239次 阅读

    Notcurses丰富的字符图形/TUI库

    ./oschina_soft/notcurses.zip
    发表于 06-16 09:17 10次 阅读
    Notcurses丰富的字符图形/TUI库

    在标准C语言中编译出来的可执行程序

    在标准C语言中,编译出来的可执行程序分为代码区(text)、数据区(data)和未初始化数据区(bs....
    的头像 嵌入式应用开发 发表于 06-16 09:01 240次 阅读
    在标准C语言中编译出来的可执行程序

    Open Golf跨平台迷你高尔夫游戏

    ./oschina_soft/Open-Golf.zip
    发表于 06-15 09:24 15次 阅读
    Open Golf跨平台迷你高尔夫游戏

    MCU说明书说有CH549的c语言,但是评估板例程包里没有,求大神帮忙

    MCU说明书说有CH549的c语言,但是评估板例程包里没有,请版主帮忙找一下,谢谢      ...
    发表于 06-15 06:01 57次 阅读

    如何通过Linux系统的Shell用户访问操作系统内核服务

    1、Linux Shell编程介绍Shell 是一个用 C 语言编写的程序,通过 Shell 用户可以访问操作系统内核服务。Shell 既是一种命令...
    发表于 06-14 16:50 3254次 阅读

    Streamly具有C语言性能的Idiomatic Haskell

    ./oschina_soft/streamly.zip
    发表于 06-13 11:23 18次 阅读
    Streamly具有C语言性能的Idiomatic Haskell

    嵌入式软件常见笔试面试题汇总

    1. 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题)
    的头像 lucky的记录与分享 发表于 06-13 07:54 290次 阅读

    C/C++基础知识汇总

    这是一篇五万字的C/C++知识点总结,包括答案。
    的头像 Linux爱好者 发表于 06-12 15:10 406次 阅读

    基于51单片机的OLED显示图片文字

    基于51单片机的OLED屏幕显示,可显示图片文字字母等。
    的头像 王子变青蛙_35400519 发表于 06-12 00:43 1779次 阅读
    基于51单片机的OLED显示图片文字

    如何提升C编程能力

    GNU C:GNU的C函数库,其实就是glibc,它是Linux上最重要的函数库,它定义了 ANSI....
    的头像 FPGA之家 发表于 06-09 10:24 249次 阅读

    c语言读写表格(csv)文件 读取csv文件示例

    逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符....
    的头像 嵌入式技术 发表于 06-08 09:22 677次 阅读
    c语言读写表格(csv)文件  读取csv文件示例

    linux基础和C语言学习总结

    学习已经近两个月了,不能说所教知识都掌握得非常好,但至少还是能跟着老师步伐、理解关键知识点、正确完成作业的。现在还没真正...
    发表于 06-07 14:48 356次 阅读

    Chafa命令行图像转换器和查看器

    ./oschina_soft/chafa.zip
    发表于 06-07 14:34 21次 阅读
    Chafa命令行图像转换器和查看器

    Zauonlok Renderer基于C语言的软件渲染器

    ./oschina_soft/renderer.zip
    发表于 06-07 14:29 18次 阅读
    Zauonlok Renderer基于C语言的软件渲染器

    整型的signed和unsigned详解 double的二进制位显示

    C语言各种数据类型的内存映像(32位平台)
    的头像 一口Linux 发表于 06-06 17:01 391次 阅读

    详细普中51单片机开发功略

    到目前为止,在电子界,如果想进入微控制器领域的学习,相信绝大多数的 人会认为要从 51 单片机开始....
    发表于 06-06 14:32 48次 阅读

    AWStudio社区版重大升级 支持高中低端全平台运行

    今天我们迎来了AWStudio社区版的重大升级。AWStudio v1.1支持从云端获取自定义控件、....
    的头像 科技绿洲 发表于 06-06 11:55 323次 阅读
    AWStudio社区版重大升级 支持高中低端全平台运行

    怎么使用C语言控制硬件

    C语言的应用编程在单片机的领域占了很大一部分,使用的比较多的51单片机和STM32单片机都可以使用M....
    的头像 要长高 发表于 06-04 17:31 458次 阅读

    如何将高级C语言编译成机器码

    C编译成机器码要通过预处理,编译,汇编,链接四个步骤。这四个步骤由谁做的呢?答案是编译器。 编译器做的工作类似我们IC行...
    发表于 06-01 16:53 2716次 阅读

    zimg图像存储和处理系统

    ./oschina_soft/zimg.zip
    发表于 05-31 10:26 24次 阅读
    zimg图像存储和处理系统

    Lilliput Discord开源的图像调整工具

    ./oschina_soft/lilliput.zip
    发表于 05-30 09:49 17次 阅读
    Lilliput Discord开源的图像调整工具