作为数据结构的基础,树分很多种,像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,微信公众号:人工智能头条】欢迎添加关注!文章转载请注明出处。
相关推荐
由于需要在内核中进行代码测试验证,完整编译安装内核比较耗时耗力。准备采用module形式来验证。
发表于 05-18 20:13 •
484次
阅读
主要内容:从应用程序发起一次IO行为,最终怎么到磁盘,以及在这个路径上有什么trace的方法和 配置....
发表于 05-16 09:23 •
57次
阅读
这里主要总结下在工作中常碰到的几种数据结构:Array,ArrayList,List,LinkedL....
该文档在概要设计的基础上,进一步的细化系统结构,展示了软件结构的图标,物理设计、数据结构设计、及算法....
硬件攻城狮 发表于 05-13 14:23
•
169次
阅读
在linux内核中,互斥量(mutex,即mutual exclusion)是一种保证串行化的睡眠锁....
书生途 发表于 05-13 08:56
•
4076次
阅读
Trie 树又叫字典树、前缀树、单词查找树,是一种二叉树衍生出来的高级数据结构,主要应用场景是处理字....
如果你对Linux是如何实现 对用户原始的网络包进行协议头封装与解析,为什么会粘包拆包,期间网络包经....
遍历顺序上依然是后序遍历(因为要比较递归返回之后的结果),但在处理中间节点的逻辑上,最大深度很容易理....
expan.zip
发表于 04-27 11:22 •
22次
阅读
用抽象的语言描述解决特定问题的每一步的操作。程序是计算机能理解和执行的指令序列。一个程序实现一个算法....
数据的运算其实就是大家熟悉的增删改查,不过相比数据库现成的SQL,数据结构实现起来有很多细节需要考虑....
gitee-WeCross.zip
发表于 04-22 10:51 •
24次
阅读
完全二叉树:完全二叉树是效率很高的数据结构。对于深度为K,有n个节点的二叉树,当且仅当每一个节点都与....
redisbook.zip
发表于 04-20 11:20 •
22次
阅读
cgroup最基本的操作时我们可以使用以下命令创建一个cgroup文件夹
OpenDSA.zip
发表于 04-19 10:10 •
32次
阅读
选择一种合适的数据结构很重要,如果在一堆随机存放的数中使用了大量的插入和删除指令,那使用链表要快得多....
编程的基础-算法和数据结构入门资料免费下载。
发表于 04-18 09:35 •
24次
阅读
关于数据结构与方法的经典教材免费下载。
发表于 04-02 16:56 •
48次
阅读
计算机408考研指定专业用书之一数据结构(C语言版)教材下载。
发表于 03-31 15:25 •
145次
阅读
1.前情概览
我们在前片博客中讲述了 proxy - stub 架构的一般编程范式,这篇文章关注驱动自身的数据传输,做一次完整的数据分析...
发表于 03-30 09:26 •
1101次
阅读
二叉查找树也叫二叉搜索树,也叫二叉排序树,它具有以下特点:1. 如果左子树不为空,则左子树上的结点的....
为了让大家掌握多种排序方法的基本思想,本篇文章带着大家对数据结构的常用七大算法进行分析:包括直接插入....
C++相关题目下载。
发表于 02-21 15:58 •
46次
阅读
串口队列环形缓冲区队列串口环形缓冲的好处代码实现队列 要实现队列环形缓冲,还需要一定的数据结构知识。队列是一种重要的数...
发表于 02-21 07:11 •
319次
阅读
单片机电路元件以及读数方法讲解((贴片)电阻,电容,二极管,蜂鸣器等)***1. 电阻和贴片电阻读数2. 电容3. 二极管读数计算及...
发表于 02-18 07:16 •
276次
阅读
1:如果串口带有奇偶校验,则需要设置32的串口字长为9位数据格式才行,否则会乱码2:如果在ucos中使用浮点数,尽量使用__align(8) 对齐...
发表于 02-18 07:15 •
413次
阅读
工业控制生产要求一体化操作更加紧密,人机交互更加频繁,所以工业一体机几乎全部采用触摸屏方式替代鼠标键盘(紧急场合保留几个...
发表于 02-16 06:37 •
367次
阅读
提供完整的解决思路和可运行的代码
发表于 02-14 07:25 •
91次
阅读
表
发表于 02-14 07:22 •
300次
阅读
W25Q128 将 16M 的容量分为 256 个块(Block),每个块大小为 64K 字节,每个块又分为 16个扇区(Sector),每个扇区 4K ...
发表于 02-14 07:19 •
100次
阅读
线
发表于 02-14 06:13 •
210次
阅读
环
发表于 02-14 06:02 •
531次
阅读
Linux内核主要学习内容可以分为三大块:进程、内存及协议栈。今天就说说内存泄露的问题。相信你在平时....
发表于 01-14 13:02 •
58次
阅读
串口队列环形缓冲区队列串口环形缓冲的好处代码实现队列 要实现队列环形缓冲,还需要一定的数据结构知识....
发表于 12-24 19:04 •
130次
阅读
1:如果串口带有奇偶校验,则需要设置32的串口字长为9位数据格式才行,否则会乱码2:如果在ucos中....
发表于 12-23 19:58 •
73次
阅读
单片机电路元件以及读数方法讲解((贴片)电阻,电容,二极管,蜂鸣器等)***1. 电阻和贴片电阻读数....
发表于 12-23 18:59 •
164次
阅读
工业控制生产要求一体化操作更加紧密,人机交互更加频繁,所以工业一体机几乎全部采用触摸屏方式替代鼠标键....
发表于 12-20 18:56 •
89次
阅读
W25Q128 将 16M 的容量分为 256 个块(Block),每个块大小为 64K 字节,每个....
发表于 12-09 15:36 •
112次
阅读
提供完整的解决思路和可运行的代码
发表于 12-09 13:51 •
77次
阅读
MCU裸机编程的状态机框架--第一部分1 状态机的概念1.1 状态机的要素1.2 状态迁移表1.3 ....
发表于 12-09 13:21 •
174次
阅读
在嵌入式软件开发中,因为代码质量不佳、线程冲突、栈溢出等问题,会造成Arm的HardFault。这种....
发表于 12-09 09:06 •
106次
阅读
FreeRTOS消息队列 传递结构体指针和结构体异同
发表于 12-08 12:06 •
160次
阅读
问题描述先描述一下整个过程吧:最近在做的一个项目,用的华大的单片机,一款国产的MCU,主要做的是低功....
发表于 12-08 11:06 •
72次
阅读
讨论堆栈操作和硬件的关系
发表于 12-06 10:21 •
97次
阅读
单片机系统中结构体数据类型的存储和读取在单片机系统开发中,系统配置参数通常需要永久存储在外部或者内部....
发表于 12-02 14:06 •
1069次
阅读
eeprom的容量一般以kb为单位,比如我们经常用到的arduino电子积木模块DS3231时钟模块....
发表于 12-01 21:06 •
327次
阅读
昨晚上,我们一个同事组织了一个小会议,大家一起讨论了一个项目的单片机代码,这个单片机用的是新唐单片机....
发表于 12-01 16:06 •
126次
阅读
数码管电路原理分析,计算,编码表数码管简介:2. 电路分析:(原理如图)==74H573芯片原理分析....
发表于 11-23 16:22 •
101次
阅读
二叉树上应该怎么求,二叉搜索树上又应该怎么求? 在求众数集合的时候有一个技巧,因为题目中众数是可....
为了避免使用低效的语言结构理解MSP430 结构的限制是重要的下面是有关怎样最好地 使用MSP43....
发表于 11-20 10:06 •
97次
阅读
AVR单片机期末自选2 4x4薄膜开关控制led灯具体内容:AVR单片机 ATmega1....
发表于 11-15 09:36 •
102次
阅读
两个按键的控制LED的程序:/* * @Author: 王云龙 * @Date: 2020-02....
发表于 11-14 13:51 •
222次
阅读
代码实现部分
发表于 11-12 20:06 •
75次
阅读
(50分)电源接口题目描述设计一个电源的接口,有一个输入电压的整型常量,值为220;设计两个抽象方法....
发表于 11-06 18:51 •
142次
阅读
本来对于嵌入式开发的要求就比较高,学员选择嵌入式软件开发应该也是深思熟虑的结果,那么在这里如果你在掌....
发表于 11-03 10:06 •
124次
阅读
该资料包括数据结构与算法分析中的二叉树与堆有关的一些知识
发表于 11-03 09:37 •
119次
阅读
mcu由于内部资源的限制,软件设计有其特殊性,程序一般没有复杂的算法以及数据结构,代码量也不大, 通....
发表于 10-29 11:36 •
171次
阅读
什么是AVL树 大家好,我是bigsai,好久不见,甚是想念,今天给大家讲讲AVL树。 对于树这....
评论