二叉树详解

【数据结构】二叉树详解 树是一种非线性的数据结构,是由多个节点组成的有层次关系的集合,看起来就像一颗倒挂的树,如下图:树中有一个节点没有前驱节点,这个节点称为根节点除根节点外,其余的节点又可以看成多个互不相交的集合,每一个集合就是一颗子树。 阅读详情

转自:http://www.embedu.org/Column/4644.html

一、简介

世界上的树有千万种,我们这里来学习我们数据结构中的树,它是我们现实生活中倒置的树。之前,我们学习的顺序表,链表,栈、和队列。可以说都是我们的线性结构,也就是我们所谓的一对一的结构,可是现实生活中,我们经常碰到是我们一对多的情况。今天,我们就来研究一下这种一对多的数据结构体—–“树”。那么,什么叫做树呢?

二、树的基本概念简介

<1>树的定义

专业定义:(1)有且只有一个称为根的结点

(2)有若干不相交的子树,这些子树本身也是一颗树。

通俗讲解:

(1)树由结点和边组成

(2)树中除根节点外,每一个节点都有一个父结点,但是 可以用多个子节点。

(3)根结点没有父结点

<2>树中的专业术语

节点 : 父节点 子节点(老子和儿子) 堂兄弟

度: 结点拥有子树的个数

叶子节点:没有子节点的节点

边 : 一个节点到另一个节点的距离

树的深度:节点的层数, 根节点默认为第一层。

有序 :树的左右位置不能改变。

<3>树的分类

一般树 : 任意一个结点的子节点的个数不受限制,则称为一般树。(子节点可以有多个),如下图:

二叉树(重点):任意一个节点的子节点的个数最多有两个,且子节点的个数不能更改。

森林:树去掉根结点就称之为森林。

提问:在下图中:

<1>A,B,H,I的度分别是多少?

A:3 B : 2 H: 1 I: 0

<2>叶子节点有哪些?

K ,L,F,G,H,I,J

<3>结点F和I在树中的第几层?

F在第3层。

M在第4层

<4>树的深度是多少?

4

三、二叉树的特性讲解

<1>二叉树的性质讲解

如下图是一颗二叉树,它有一些特性:

思考:第一层最多有多少个? 1个

第二层最多有多少个? 2 个

第三层最多有多少个? 4 ?

规律:第i层结点最后有2的n - 1次方个。

性质1:二叉树的第i层上的结点最多有2的i - 1次方个节点。

思考:深度为1的二叉树(遍历第一层)一共有多少个节点? 1个

深度为2的二叉树(遍历到第二层)一共有多少个节点? 3个

深度为3的二叉树(遍历到第三层)一共有多少个节点? 7个

规律:深度为k的而出书,最多有2的k次方 - 1个节点。

性质2:深度为k的二叉树最多有2的k次方-1个结点。

性质3:在任意一棵二叉树中,树叶的数目比度数为2的结点的数目多1.

(推导过程入下图所示:)

<2>二叉树的分类

满二叉树:在一颗二叉树中,如果所有的分支节点都存在左子树和右子树,并且所有的叶子节点都在同一层上,这样的二叉树,我们称之为满二叉树。

满二叉树的特点:<1>叶子节点只会出现在最下面一层。

<2>非叶子节点的节点,拥有子树的个数一定为2.

<3>在同样深度的二叉树中,满二叉树的节点个数最多。

完全二叉树:对一颗具有n个结点的二叉树按层进行编号,如果编号为i

(1 <= i <= n)的结点与同样深度的满二叉树节点编号为i的结点

在二叉树中的位置完全相同,则这颗树,我们称之为完全二叉树。

如下图所示。

提问:下面这些树,是完全二叉树吗? 不是

总结:满二叉树一定是完全二叉树,完全二叉树不一定是满二叉树。

四、二叉树的存储

(1)顺序存储[完全二叉树]

(顺序存储的话,若不是完全二叉树存储没有意义。)

假设下面有一颗树,我们如何把它存到数组中呢?

思路:先把转换成完全二叉树,然后再编号。

这样存储就看似没有什么问题。我们可以按照编号把数据存储到数组中,我们按照编号(1,2,3,4,5)的顺序存储就可以了啊!这个时候,我就要问了,假说说,我们的m的编号,你怎么知道我们的3好位置是在下面,而不是在我们的m编号的位置呢?我们的连续存储无法识别。(这种方法,我们无法推断树的结构)。

因此,我们顺序存储规定:

无论是何种树,我们都会转换成完全二叉树。然后一层一层的从左给我们的二叉树进行编号,然后存储在数组中。及如下图。

那么我们以上的存储有什么规律呢?假设某个节点为i的话,我们来观察一下。

是不是所有的左孩子都是偶数,所有的右孩子都是奇数啊!

完全二叉树的特点:

对于编号为i(i>=1)的结点:

(1)左孩子存在:2 * i <= n(节点的个数),左孩子编号

(2)右孩子存储:2 * i + 1 <= n,右孩子编号 2 * i + 1

(2)链式存储[完全二叉树]

链式存储:定义结点保存左孩子和右孩子的地址。

思考:上述过程,我们的二叉树应该定义什么样的数据类型来保存结点呢?

<4>二叉树的遍历

(1)层次遍历:从上到下一层一层的遍历

(2)前序遍历:根 、左(左子树)、右(右子树)

(3)中序遍历:左(左子树) 、根 、右(右子树)

(4)后序遍历:左(左子树)、右(右子树)、根

规则:遇到根结点则输出,否则遍历。

层次遍历:ABCDEFGHI

先序遍历:ABDGHCEIF

中序遍历:GDHBAEICF

后序遍历:GHDBIEFCA

完全二叉树的递归创建思路:

1.首先,写一个创建单个节点的函数malloc_bnode,左孩子和右孩子都为空并且填充,我们需要的数据

2.然后写一个创建二叉树的函数create_binarytree()函数。调用malloc_bond

函数创建节点,然后判断结点有没有左孩子和右孩子。

2 *num <= n ,左孩子存在 (num为我们的结点编号,n为我们的结点个数)

再次,调用create_binarytree()创建该编号的孩子。

2 *num + 1 <=n,右孩子存储。

再次,调用create_binarytree()创建该编号的孩子,最后返回根节点。

 


Unity 2022打包Android APK:手把手教你创建和配置第一个签名Keystore(避坑指南) 本文详细介绍了Unity 2022打包Android APK时创建和配置签名Keystore的全流程,包括环境准备、Keystore创建、高级配置避坑指南以及签名验证与故障排查。特别强调了Android应用签名的重要性及安全维护策略,帮助开发者避免常见错误,确保应用顺利发布。 阅读详情

相关推荐

基于FPGA的ov5640摄像头简易图像采集装置详解

本文介绍一种基于FPGA的,通过流模式DDR实现OV5640摄像头数据采集并显示的方法。

qq_42230252的博客 1万+

各种二叉树的介绍

数据结构中有很多种类的树结构,例如,普通二叉树、完全二叉树、满二叉树、线索二叉树、哈夫曼树、二叉搜索树(排序树)、平衡二叉树、AVL平衡二叉树、红黑树、B树、B+树、堆 1、普通二叉树、完全二叉树、满二叉树 二叉树:最多有两棵子树的树被称为二叉树 满二叉树:二叉树中所有非叶子结点的度都是2,且叶子结点都在同一层次上 完全二叉树:如果一个二叉树与满二叉树前m个节点的结构相同,这样的二叉树被称

雪村一郎的博客 2万+

油气井管柱力学发展

油气井管柱力学发展 1 石油管柱力学问题的发复杂性 1)油气管柱动力学的非线性 钻井中钻柱在重力、钻压、扭矩、钻井液浮力和井壁约束等作用下,产生三维变形。一方面随井眼轴线的弯曲而弯曲,这一变形被称为管柱的初位移;另一方面,管柱在运动过程中相对井眼轴线也有变形,这种变形被称为计算位移。管柱大变形主要表现在初位移部分,计算位移相对很小。大曲率井眼中管柱产生大挠度,但管柱很长且柔软性较好,变形一般仍保持...

weixin_43831995的博客 951

【数据结构】——二叉树详解

二叉树(Binary Tree)是由n个结点构成的有限集(n≥0),n=0时为空树,n>0时为非空树。对于非空树TTT有且仅有一个根结点;除根结点外的其余结点又可分为两个不相交的子集TLT_LTL​和TRT_RTR​,分别称为TTT的左子树和右子树,且TLT_LTL​和TRT_RTR​本身又都是二叉树。很明显该定义属于递归定义,所以有关二叉树的操作使用递归往往更容易理解和实现。从定义也可以看出二叉树与一般树的区别主要是两点,一是每个结点的度最多为2;

atwdy的博客 6万+

使用STM输出互补SPWM波(三相各差120°)

使用STM32输出SPWM波形(三相各差120°)

hello011102的博客 7373

【芯片驱动】2. CMT2300A配合硬件测试(灵敏度和发射功率)的软件实现

前言 在开发一款无线射频产品的时候,软件是一部分,硬件也是一部分。而决定无线收发性能的,首先是硬件的匹配电路,然后才到软件部分的优化。 一款无线射频产品,首先需要先决定是在那个频率范围内(当然是国家允许的范围内),然后硬件则需要在基于这个频点范围进行硬件的参数匹配,具体又分为发送功率匹配、天线匹配、和接收灵敏度的匹配。 现在我们使用2300a这款无线芯片来说,除非自己的团队是射频专家,则可以自己进行无线外围电路的设计外,另外一种更加快捷的方式,就是寻找原厂技术支持,他们会给...

sishuihuahua的博客 7054

【数据结构】什么是二叉树?

数据结构二叉树学习笔记,内容包括:二叉树的定义,二叉树的特点,特殊的二叉树,二叉树的性质,二叉树的存储结构,二叉树的遍历等相关内容.

C/C++领域,数据结构,linux,MySQl学习者 3307

yolov26改进 | 融合改进篇 | 基于 MobileNetV4 和双向特征金字塔网络BiFPN的融合改进(全网独家首发)

本文介绍BiFPN与MobileNetV4融合改进的YOLOv26。许多模块单独使用能够涨点,但直接叠加后可能因功能重复、通道不匹配、尺度冲突而掉点,因此融合前必须理解各模块作用。MobileNetV4利用UIB与Mobile MQA构建轻量主干,提升特征提取能力;BiFPN通过可学习权重完成双向多尺度融合,强化大、中、小目标的信息交互。两者优化Backbone与Neck,功能互补、结构冲突较少。本文提供代码、配置、消融对比及Codex修改思路,MobileNetV4也可替换其他主干,便于组合实验与二次创新

Snu77的博客 241

二叉树之二叉树的深度

二叉树之二叉树的深度

qq_43218521的博客 6191

山东大学机试试题合集

山东大学机试试题合集

qq_63349644的博客 2622

YOLOv13改进策略【特征提取层】| 引入注意力卷积模块RFAConv,关注感受野空间特征 助力yolov13精度提升

RFAConv:创新空间注意力和标准卷积运算感受野空间特征是针对卷积核设计的,根据卷积核大小动态生成。以3×3卷积核为例,它由非重叠滑动窗口组成,每个窗口代表一个感受野滑块。

Limiiiing的博客 362

java二叉树详解_二叉树详解

树是一种比较重要的数据结构,尤其是二叉树。二叉树是一种特殊的树,在二叉树中每个节点最多有两个子节点,一般称为左子节点和右子节点(或左孩子和右孩子),并且二叉树的子树有左右之分,其次序不能任意颠倒。本篇博客将详细为大家解析二叉树。首先介绍两个概念:满二叉树:在一棵二叉树中,如果所有分支结点都有左孩子和右孩子结点,并且叶子结点都集中在二叉树的最下层,这样的树叫做满二叉树如:完全二叉树:若二叉树中最多只...

weixin_28730131的博客 968

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Java中关于二叉树详解

目录一、树形结构1.1 相关概念1.2树的表示形式1.3树的应用:文件系统管理(目录和文件)二、二叉树2.1相关概念2.2 二叉树的基本形态2.3 两种特殊的二叉树2.4 二叉树的性质2.5 二叉树的存储2.6 二叉树的基本操作2.6.1二叉树的遍历2.6.2 二叉树的基本操作总结 一、树形结构 树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点: 有一个特殊的节点,称为根节点,

dddddrrrzz的博客 3626

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

关于线索二叉树的详解

线索二叉树的详解 目录线索二叉树的详解前言一、线索二叉树是什么?三种二叉树线索化实例图二、实现线索二叉树1.二叉树的线索化2.线索二叉树的遍历中序线索二叉树寻找遍历的首节点中序线索二叉树寻找节点的直接后继遍历中序线索二叉树总结 前言 学了二叉树,我们发现,对二叉树的遍历是一个比较复杂的问题,需要用到递归或者栈才可以进行遍历,这样子的遍历实质上就是将二叉树化为一个有序的线性序列,在这个序列中,每一个节点有且只有一个前继节点(第一个节点除外),和一个后继节点(最后一个节点除外),但是这些节点不能直接的找到当

kcy的博客 1万+

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

二叉树的详解与实现

简介 二叉树的相关概念,如,树高度,节点层数,节点度数,路径,叶节点,分支节点,根节点,父节点,左节点,右节点,兄弟节点,祖先节点,子孙节点,左子树,右子树等基本概念,不再赘述。 二叉树分类 1、完全二叉树 若设二叉树的高度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第h层有叶子结点,并且叶子结点都是从左到右依次排布,这就是完全二叉树。 一维数组可以作为完全二叉树...

注意路标 16万+

详解线索二叉树

对线索二叉树的概念进行说明,并分别介绍了中序线索二叉树、先序线索二叉树和后序线索二叉树找其前驱和后继的方法。

kusunoki的博客 9930

二叉树公式及详解。

基本名词概念 二叉树:n个有限元素的集合,该集合或者为空、或者由一个称为根(root)的元素及两个不相交的、被分别称为左子树和右子树的二叉树组成,是有序树。当集合为控时,称该二叉树为空二叉树。在二叉树中,一个元素也称为一个节点。(这段官话) 简单理解就是二叉树还是树,但是节点最多二个分叉。 树的度:一个节点有m个分叉,那么这个节点的度就为m。叶子节点的度为0,因为它没有分叉。 二叉树节点的度只有0,1,2这三种,其中为0的肯定是叶子节点。 二叉树的高度(深度):max(左子树深度,右子树深度)+1

qq_41054844的博客 2万+

详解二叉树的遍历

概述 二叉树的遍历是一个很常见的问题。二叉树的遍历方式主要有:先序遍历、中序遍历、后序遍历、层次遍历。先序、中序、后序其实指的是父节点被访问的次序。若在遍历过程中,父节点先于它的子节点被访问,就是先序遍历;父节点被访问的次序位于左右孩子节点之间,就是中序遍历;访问完左右孩子节点之后再访问父节点,就是后序遍历。不论是先序遍历、中序遍历还是后序遍历,左右孩子节点的相对访问次序是不变的,总是先访问左孩子...

supermouse的博客 1万+
上一篇: LinkedList用法及源码解析
下一篇: HashMap用法及源码解析
武装
博客等级 码龄9年 36粉丝 35原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值