创作

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

3天内不再提示

二叉树,一种基础的数据结构类型

人工智能头条 来源:lp 2019-04-13 10:48 次阅读

作为数据结构的基础,树分很多种,像AVL树、红黑树、二叉搜索树....今天我想分享的是关于二叉树,一种基础的数据结构类型。

01

什么是树

在《数据结构》[注1]中树有如下定义:

树是 n(n≥0) 个结点的有限集

在此我对上述定义做出如下解释:

当n=0n=0时,为空树,树的深度与高度均为00,是树的一种特例;当n>0n>0时,为非空树,树的第一个结点,即深度为11的结点,我们称其为根结点,由根结点可以引出若干子树分支,同时子树分支可依此向下延伸,此时树的深度与高度也在变化,即树状图。

这里我们需要厘清树的深度与树的高度与其他树的术语:

树的深度:树中结点的最大层次

树的高度:从叶子结点开始定义,叶子结点为第一层,往上依次递增,直至根结点。

结点:树的结点包含一个数据元素以及若干指向其子树的分支

度:结点所拥有的子树数量

终端节点:度为0的结点称为叶子结点或终端结点

树的度:树中各结点度的最大值

层次:从根开始定义,根为第一层,依次递增

有序树:树中结点的各子树从左往右是有次序的,不可相互交换;反之则是无序树

森林:一棵非空树删掉根结点,即是森林

02

二叉树的概念引入

二叉树是由树演化而来的一种数据结构,上面所有术语均适用于二叉树。二叉树与树不同之处在于,树的每一个结点(除终端结点外)允许有若干子树分支;而二叉树只允许有左右两个子树分支,即不存在度大于2结点。

C语言示例:

上面的示例清晰地阐明了二叉树的结点是由一个数据元素和两个子树分支构成,需要明确的是,虽然终端结点没有指向任何子树,但它仍旧有往下繁衍的能力。

除此之外,二叉树还是一棵有序树,它的各个结点从左到右是依次有序可循的,且不可交换;它具有以下五种形态:

空树

仅有根结点

左子树为空

右子树为空

左右子树均非空

当二叉树处于第五种状态,且设树的深度为n,总结点数为时,我们称其为满二叉树。

‍‍事实上还有另外一种也处于第五状态的树——完全二叉树。由于完全二叉树的定义在每个版本的教科书中均不相同,而笔者只接触过《数据结构·严蔚敏版》,因此摘录此书中对完全二叉树的定义:

深度为k的,有n个结点的二叉树,当且仅当其每一个结点都与深度为k的满二叉树中编号从1至n的结点一一对应时,称之为完全二叉树。

这段描述我读了两遍,方才理解其中的深刻含义,我们把深度为3的满二叉树的每个结点从上往下,从左往右进行编号:‍‍

然后我们再定义一棵深度也为3的二叉树,该二叉树的n 个结点(n≤7),当从1到n的每个结点都与上图中的编号结点一一对应时,这二叉树就称为完全二叉树。

举个例子,当n=5时:

这便是完全二叉树。

因此我们还可以得到一个推论:满二叉树是完全二叉树,但完全二叉树不一定是满二叉树。

当二叉树处于第三种状态时,称其为右斜树。

同理,处于第四状态为左斜树。

‍‍‍‍03

二叉树的性质总结

二叉树的第i 层上最多有个结点。此性质可通过上面满二叉树的图示推得

深度为n 的二叉树,最多拥有个结点。此性质可以通过数列求和得出:

设满二叉树深度为 n,叶子结点数必为

设任意一棵二叉树的叶子结点数为n0,度为1的结点数为n1,度为2的结点数为n2;总结点数为n。则有:

设分支的总边数为x,则有:

联立上述三式可得:

即任意二叉树的叶子结点数为该树中度为2的结点数的总和加一。

设一完全二叉树具有n个结点,则其深度必为,[x]表示不大于x的最大整数,即向下取整。

04

手把手建立二叉树

C语言示例:

其中需要指明的是二叉树的三种遍历方法:先序遍历、中序遍历、后序遍历。

先序遍历

即遍历顺序为“根—>左->右”。

中序遍历

即遍历顺序为“左—>根—>右”,由于二叉树为有序树,因此中序遍历输出的值由小到大的。

后序遍历

即遍历顺序为“左—>右—>根”。

还有一种遍历法,称为层序遍历,有兴趣的读者可以尝试着写一下。

原文标题:二叉树的原理推敲与动手种树

文章出处:【微信号:AI_Thinker,微信公众号:人工智能头条】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    深入理解Linux内核中的算法和数据结构

    由于需要在内核中进行代码测试验证,完整编译安装内核比较耗时耗力。准备采用module形式来验证。
    发表于 05-18 20:13 484次 阅读
    深入理解Linux内核中的算法和数据结构

    块设备层的数据结构 page/request和bio的关系

    主要内容:从应用程序发起一次IO行为,最终怎么到磁盘,以及在这个路径上有什么trace的方法和 配置....
    发表于 05-16 09:23 57次 阅读
    块设备层的数据结构 page/request和bio的关系

    盘点几种常见的数据结构

    这里主要总结下在工作中常碰到的几种数据结构:Array,ArrayList,List,LinkedL....
    的头像 Linux内核补给站 发表于 05-13 15:58 3723次 阅读
    盘点几种常见的数据结构

    嵌入式软件详细设计

    该文档在概要设计的基础上,进一步的细化系统结构,展示了软件结构的图标,物理设计、数据结构设计、及算法....
    的头像 硬件攻城狮 发表于 05-13 14:23 169次 阅读

    详解linux内核中的mutex同步机制

    在linux内核中,互斥量(mutex,即mutual exclusion)是一种保证串行化的睡眠锁....
    的头像 书生途 发表于 05-13 08:56 4076次 阅读
    详解linux内核中的mutex同步机制

    Trie树数据结构的实现原理和题目实践

    Trie 树又叫字典树、前缀树、单词查找树,是一种二叉树衍生出来的高级数据结构,主要应用场景是处理字....
    的头像 算法与数据结构 发表于 05-11 17:47 572次 阅读

    Linux发送HTTP网络包图像 sk_buff数据结构解析

    如果你对Linux是如何实现 对用户原始的网络包进行协议头封装与解析,为什么会粘包拆包,期间网络包经....
    的头像 一口Linux 发表于 05-10 12:14 188次 阅读

    二叉树的最小深度

    遍历顺序上依然是后序遍历(因为要比较递归返回之后的结果),但在处理中间节点的逻辑上,最大深度很容易理....
    的头像 算法与数据结构 发表于 04-28 16:27 319次 阅读

    ExpAn用于A/B测试统计分析的开源Python库

    expan.zip
    发表于 04-27 11:22 22次 阅读
    ExpAn用于A/B测试统计分析的开源Python库

    编程基础必学:浅析数据结构!

    用抽象的语言描述解决特定问题的每一步的操作。程序是计算机能理解和执行的指令序列。一个程序实现一个算法....
    的头像 C语言编程学习基地 发表于 04-24 16:38 332次 阅读

    数据结构的三大要素

    数据的运算其实就是大家熟悉的增删改查,不过相比数据库现成的SQL,数据结构实现起来有很多细节需要考虑....
    的头像 C语言编程学习基地 发表于 04-24 16:25 235次 阅读

    WeCross区块链跨链协作平台

    gitee-WeCross.zip
    发表于 04-22 10:51 24次 阅读
    WeCross区块链跨链协作平台

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

    完全二叉树:完全二叉树是效率很高的数据结构。对于深度为K,有n个节点的二叉树,当且仅当每一个节点都与....
    的头像 C语言编程学习基地 发表于 04-21 16:20 299次 阅读

    Redis设计与实现

    redisbook.zip
    发表于 04-20 11:20 22次 阅读
    Redis设计与实现

    一文详细了解Cgroup

    cgroup最基本的操作时我们可以使用以下命令创建一个cgroup文件夹
    的头像 Linux阅码场 发表于 04-20 11:10 361次 阅读

    OpenDSA数据结构和算法教程

    OpenDSA.zip
    发表于 04-19 10:10 32次 阅读
    OpenDSA数据结构和算法教程

    C语言代码优化的一些技巧

    选择一种合适的数据结构很重要,如果在一堆随机存放的数中使用了大量的插入和删除指令,那使用链表要快得多....
    的头像 STM32嵌入式开发 发表于 04-18 10:37 266次 阅读

    程序设计和数据结构(嵌入式)

    编程的基础-算法和数据结构入门资料免费下载。
    发表于 04-18 09:35 24次 阅读

    数据结构与算法分析课件免费下载

    关于数据结构与方法的经典教材免费下载。
    发表于 04-02 16:56 48次 阅读

    数据结构(C语言版)教材下载

    计算机408考研指定专业用书之一数据结构(C语言版)教材下载。
    发表于 03-31 15:25 145次 阅读

    openHarmony IPC数据调用的过程分享

    1.前情概览 我们在前片博客中讲述了 proxy - stub 架构的一般编程范式,这篇文章关注驱动自身的数据传输,做一次完整的数据分析...
    发表于 03-30 09:26 1101次 阅读

    如何使用 go 实现红黑树

    二叉查找树也叫二叉搜索树,也叫二叉排序树,它具有以下特点:1. 如果左子树不为空,则左子树上的结点的....
    的头像 Linux爱好者 发表于 03-21 11:54 322次 阅读

    解析数据结构的常用七大排序算法

    为了让大家掌握多种排序方法的基本思想,本篇文章带着大家对数据结构的常用七大算法进行分析:包括直接插入....
    的头像 C语言编程学习基地 发表于 03-16 08:22 397次 阅读

    C++相关题目下载

    C++相关题目下载。
    发表于 02-21 15:58 46次 阅读

    实现队列环形缓冲的方法

    串口队列环形缓冲区队列串口环形缓冲的好处代码实现队列  要实现队列环形缓冲,还需要一定的数据结构知识。队列是一种重要的数...
    发表于 02-21 07:11 319次 阅读

    电阻读取方法分享

    单片机电路元件以及读数方法讲解((贴片)电阻,电容,二极管,蜂鸣器等)***1. 电阻和贴片电阻读数2. 电容3. 二极管读数计算及...
    发表于 02-18 07:16 276次 阅读

    如果在ucos中使用浮点数会怎样呢

    1:如果串口带有奇偶校验,则需要设置32的串口字长为9位数据格式才行,否则会乱码2:如果在ucos中使用浮点数,尽量使用__align(8) 对齐...
    发表于 02-18 07:15 413次 阅读

    常见的嵌入式工业触摸一体机有哪些

    工业控制生产要求一体化操作更加紧密,人机交互更加频繁,所以工业一体机几乎全部采用触摸屏方式替代鼠标键盘(紧急场合保留几个...
    发表于 02-16 06:37 367次 阅读

    怎样使用串口发送结构体呢

    提供完整的解决思路和可运行的代码
    发表于 02-14 07:25 91次 阅读

    MCU软件开发之数据结构表相关资料分享

    发表于 02-14 07:22 300次 阅读

    如何对FLASH进行分区呢

    W25Q128 将 16M 的容量分为 256 个块(Block),每个块大小为 64K 字节,每个块又分为 16个扇区(Sector),每个扇区 4K ...
    发表于 02-14 07:19 100次 阅读

    MCU软件开发之数据结构线相关资料推荐

    线
    发表于 02-14 06:13 210次 阅读

    MCU软件开发之数据结构环相关资料推荐

    发表于 02-14 06:02 531次 阅读

    Linux内核源码分析-进程的哪些内存类型容易引起内存泄漏?

    Linux内核主要学习内容可以分为三大块:进程、内存及协议栈。今天就说说内存泄露的问题。相信你在平时....
    发表于 01-14 13:02 58次 阅读
    Linux内核源码分析-进程的哪些内存类型容易引起内存泄漏?

    STM32串口环形缓冲--使用队列实现(开放源码)

    串口队列环形缓冲区队列串口环形缓冲的好处代码实现队列  要实现队列环形缓冲,还需要一定的数据结构知识....
    发表于 12-24 19:04 130次 阅读
    STM32串口环形缓冲--使用队列实现(开放源码)

    stm32问题

    1:如果串口带有奇偶校验,则需要设置32的串口字长为9位数据格式才行,否则会乱码2:如果在ucos中....
    发表于 12-23 19:58 73次 阅读
    stm32问题

    单片机电路元件以及读数方法讲解((贴片)电阻,电容,二极管,蜂鸣器等)

    单片机电路元件以及读数方法讲解((贴片)电阻,电容,二极管,蜂鸣器等)***1. 电阻和贴片电阻读数....
    发表于 12-23 18:59 164次 阅读
    单片机电路元件以及读数方法讲解((贴片)电阻,电容,二极管,蜂鸣器等)

    飞凌嵌入式正式推出FDU070S-R01一体机,专为高性能人机交互、智能设备定义自主研发设计

    工业控制生产要求一体化操作更加紧密,人机交互更加频繁,所以工业一体机几乎全部采用触摸屏方式替代鼠标键....
    发表于 12-20 18:56 89次 阅读
    飞凌嵌入式正式推出FDU070S-R01一体机,专为高性能人机交互、智能设备定义自主研发设计

    对SPI FLASH的设计思路

    W25Q128 将 16M 的容量分为 256 个块(Block),每个块大小为 64K 字节,每个....
    发表于 12-09 15:36 112次 阅读
    对SPI FLASH的设计思路

    怎样用串口发送结构体-简单协议的封包和解包

    提供完整的解决思路和可运行的代码
    发表于 12-09 13:51 77次 阅读
    怎样用串口发送结构体-简单协议的封包和解包

    MCU裸机编程的状态机框架--第一部分

    MCU裸机编程的状态机框架--第一部分1 状态机的概念1.1 状态机的要素1.2 状态迁移表1.3 ....
    发表于 12-09 13:21 174次 阅读
    MCU裸机编程的状态机框架--第一部分

    嵌入式软件程序HardFault异常的查找方法

    在嵌入式软件开发中,因为代码质量不佳、线程冲突、栈溢出等问题,会造成Arm的HardFault。这种....
    发表于 12-09 09:06 106次 阅读
    嵌入式软件程序HardFault异常的查找方法

    FreeRTOS消息队列 传递结构体指针和结构体异同

    FreeRTOS消息队列 传递结构体指针和结构体异同
    发表于 12-08 12:06 160次 阅读
    FreeRTOS消息队列 传递结构体指针和结构体异同

    记:又一次离谱的内存溢出

    问题描述先描述一下整个过程吧:最近在做的一个项目,用的华大的单片机,一款国产的MCU,主要做的是低功....
    发表于 12-08 11:06 72次 阅读
    记:又一次离谱的内存溢出

    【MCU】堆栈的满空和生长方向

    讨论堆栈操作和硬件的关系
    发表于 12-06 10:21 97次 阅读
    【MCU】堆栈的满空和生长方向

    嵌入式系统中结构体数据类型的存储和读取

    单片机系统中结构体数据类型的存储和读取在单片机系统开发中,系统配置参数通常需要永久存储在外部或者内部....
    发表于 12-02 14:06 1069次 阅读
    嵌入式系统中结构体数据类型的存储和读取

    EEPROM 和SPI flash的区别

    eeprom的容量一般以kb为单位,比如我们经常用到的arduino电子积木模块DS3231时钟模块....
    发表于 12-01 21:06 327次 阅读
    EEPROM 和SPI flash的区别

    新唐单片机代码评审总结

    昨晚上,我们一个同事组织了一个小会议,大家一起讨论了一个项目的单片机代码,这个单片机用的是新唐单片机....
    发表于 12-01 16:06 126次 阅读
    新唐单片机代码评审总结

    51单片机~数码管电路原理分析,计算,编码表完整版,显示代码,中文命名.c文件报错问题

    数码管电路原理分析,计算,编码表数码管简介:2. 电路分析:(原理如图)==74H573芯片原理分析....
    发表于 11-23 16:22 101次 阅读
    51单片机~数码管电路原理分析,计算,编码表完整版,显示代码,中文命名.c文件报错问题

    二叉树上应该怎么求

      二叉树上应该怎么求,二叉搜索树上又应该怎么求? 在求众数集合的时候有一个技巧,因为题目中众数是可....
    的头像 算法与数据结构 发表于 11-22 11:32 540次 阅读

    【高效单片机语言结构】怎样最好地使用MSP430 编译器的建议

    为了避免使用低效的语言结构理解MSP430 结构的限制是重要的下面是有关怎样最好地 使用MSP43....
    发表于 11-20 10:06 97次 阅读
    【高效单片机语言结构】怎样最好地使用MSP430 编译器的建议

    AVR单片机期末自选2 4x4薄膜开关控制led灯

    AVR单片机期末自选2 4x4薄膜开关控制led灯具体内容:AVR单片机 ATmega1....
    发表于 11-15 09:36 102次 阅读
    AVR单片机期末自选2      4x4薄膜开关控制led灯

    51单片机学习笔记———4.两个按键控制LED小灯

    两个按键的控制LED的程序:/* * @Author: 王云龙 * @Date: 2020-02....
    发表于 11-14 13:51 222次 阅读
    51单片机学习笔记———4.两个按键控制LED小灯

    按键菜单程序设计:基于单片机等C语言开发环境的菜单程序设计思路以及代码实现(二)

    代码实现部分
    发表于 11-12 20:06 75次 阅读
    按键菜单程序设计:基于单片机等C语言开发环境的菜单程序设计思路以及代码实现(二)

    Java习题05(02)电源接口

    (50分)电源接口题目描述设计一个电源的接口,有一个输入电压的整型常量,值为220;设计两个抽象方法....
    发表于 11-06 18:51 142次 阅读
    Java习题05(02)电源接口

    嵌入式软件开发需要学习的知识点

    本来对于嵌入式开发的要求就比较高,学员选择嵌入式软件开发应该也是深思熟虑的结果,那么在这里如果你在掌....
    发表于 11-03 10:06 124次 阅读
    嵌入式软件开发需要学习的知识点

    数据结构与算法分析中的二叉树与堆有关知识汇总

    该资料包括数据结构与算法分析中的二叉树与堆有关的一些知识
    发表于 11-03 09:37 119次 阅读

    MCU 中断划分

    mcu由于内部资源的限制,软件设计有其特殊性,程序一般没有复杂的算法以及数据结构,代码量也不大, 通....
    发表于 10-29 11:36 171次 阅读
    MCU 中断划分

    二叉排序树AVL如何实现动态平衡

      什么是AVL树 大家好,我是bigsai,好久不见,甚是想念,今天给大家讲讲AVL树。 对于树这....
    的头像 算法与数据结构 发表于 10-28 17:02 557次 阅读
    二叉排序树AVL如何实现动态平衡