树与二叉树(课堂笔记)

本节内容稍多,请根据所需按目录浏览
相应性质有举例,里面有很多个人想法,如有不懂欢迎评论,如有差错欢迎指出

在这里插入图片描述
图 (a)是一棵只有一个根结点的树;
图(b)是一棵有12个结点的树,即T={A,B,C,…,K,L }。A是棵根,除根结点A之外,其余的11个结点分为三个互不相交的集合。T1,T2和T3是根A的三棵子树,且本身又都是一棵树。所以树的定义是递归的 。

树的表示
树形图表法
广义表法
在这里插入图片描述
嵌套集合法 凹入表示法
在这里插入图片描述

基本术语

结点:数据元素+若干指向子树的分支
节点的度:一个结点拥有的子树个数
树的度:树种所有节点的度的最大值
叶子结点:度为零的结点
分支接点:度大于零的节点
(从根到节点的)路径:由从根到该结点锁经分值和节点构成
孩子结点与双亲节点:结点子树的根称为这个结点的孩子,而这个结点又被称为孩子的双亲
兄弟结点:同一个双亲的孩子之间互为兄弟
堂兄弟:双亲在同一层的结点互为堂兄弟
子孙结点:以某结点为根的子树中的所有结点都被称为是该结点的子孙
祖先结点:从根结点到该结点路径上的所有结点
结点的层次:假设根结点的层次为1,第m 层的结点的子树根结点的层次为m+1
树的深度:树中叶子结点所在的最大层次
有序树、无序树:如果将树中结点的各子树看成是从左向右有次序的,不能互换的,则称该树为有序树,否则称为无序树

森林:是m(m≥0)棵互不相交的树的集合
任何一棵树都是一个二元组 Tree={root,F},其中root是数据元素,成为树的根节点;F是m(m>=0)课树的森林,F={ T1,T2,…,Tm},其中Ti={ri,Fi}(递归)称为根root的第i棵子树;当m≠0时,在树根和子树森林之间存在下列关系:
RF={<root,ri>︱i=1,2,…,m,m>0}

树的性质

性质1 树中的结点数等于所有结点的度数之和加1。
【例】一棵度为4的树T中,若有20个度为4的结点,10个度为3的结点,1个度为2的结点,10个度为1的结点,则树T的叶子结点个数是 。
A.41 B.82
C.113 D.122
n=20x4+10x3+1x2+10x1+1=123
叶子结点个数:123-(20+10+1+10)=82
答案:B;

性质2 度为m的树中第i层上至多有m∧ ⁱ ⁻¹个结点(i≥1)。

性质3 高度为h的m次树至多有
在这里插入图片描述
个结点。
性质4 具有n个结点的m次树的最小高度为

在这里插入图片描述
关于取整符号:向上取整⌈⌉和向下取整⌊⌋符号
向下取整的运算称为Floor,用数学符号 ⌊ ⌋ 表示;向上取整的运算称为Ceiling,用数学符号 ⌈ ⌉ 表示。例如:
⌊59/60⌋=0
⌈59/60⌉=1
⌊-59/60⌋=-1
⌈-59/60⌉=0
向上向下 取整函数数只会对小数点后面的 数字不为零 的数进行操作,
要是给它一个整数 它就返回整数本身
对小数不为零的数操作:
给定 4.9
调用用向下取整函数 得到的是 4
调用用向上取整函数 得到的是 5

向上取整:比自己大的最小整数;
向下取整:比自己小的最大整数;
四舍五入:更接近自己的整数;

之所以在向上取整时,分子部分要减去1,是为了避免出现,a 能被 b 整除的情况。

向上取整 : 12 / 3 == 4, (12+3)/3==5,而对 3 向上取整仍为 3.
向下取整: 1/2 ⇒ 0 -1/2 ⇒ -1

在这里插入图片描述

树的存储结构

双亲表示法:用一组地址连续的存储单元来存放树的节点,每个节点有两个域
data域——存放结点的值
parent域——存放该节点唯一的双亲节点的位置(数组下标);
特点:利用了根节点之外的每个节点只有唯一双亲的性质,球结点的双亲和祖先节点很容易,但求结点的孩子节点需要遍历整个数组。
例:
在这里插入图片描述
在这里插入图片描述
孩子表示法
把每个结点的孩子结点排列起来,看做线性表,且以单链表做存储结构
在这里插入图片描述
双亲孩子表示法
找结点的双亲与子孙都方便在这里插入图片描述
孩子兄弟表示法
用二叉链表作为树的存储结构,每个节点的左链域指向该结点的第一个孩子,右链域指向下一个兄弟结点
在这里插入图片描述
孩子兄弟存储结构的优点是可以方便的实现树和二叉树的相互转换和树的各种操作;缺点是查找当前结点的双亲结点比较繁琐.解决方法 增加parent域

树和森林的遍历

方法有
按广度优先遍历(层次遍历)
按深度优先遍历,又可分为:前序遍历,后序遍历

前序遍历;若树不为空,则先访问根结点,然后依次遍历各根子树
后序遍历:若树不为空,则依次先序遍历各课子树,然后访问根节点。

例:写出 层次,先序,后序 遍历结果
在这里插入图片描述
层次 :ABCDEFGHIJK
前序遍历访问次序:ABEFCDGHIJK
后序遍历访问次序:EFBCIJKHGDA

注意:前序遍历一棵树恰好等价于前序遍历该树所对应的二叉树
后序遍历树恰好等于中序遍历该数所对应的二叉树

森林的遍历
森林的组成:
1.森林中第一棵树的根结点;
2.森林中第一棵树的子树森林;
3.森林中其它树构成的森林。

1.前(先)序遍历
(1)若森林不空,则访问森林中第一棵树的根结点;
(2)前序遍历森林中第一棵树的子树森林;
(3)前序遍历森林中(除第一棵树之外)其余树构成的森林。
即:依次从左至右对森林中的每一棵树进行前序遍历。
2.后序遍历
(1)若森林不空,则后序遍历森林中第一棵树的子树森林;
(2)访问森林中第一棵树的根结点;
(3)后序遍历森林中(除第一棵树之外)其余树构成的森林。
即:依次从左至右对森林中的每一棵树进行后序遍历。

例:写出下面森林的先序和后序遍历序列
在这里插入图片描述
先序:ABCDEFGHI
后序:BCDAFAHIG

二叉树

二叉树是另一种重要的树形结构,是度为2有序树,它的特点是每个结点至多有两棵子树。
二叉树是n(n≥0)个结点的有限集。它或者是空集(n=0),或者同时满足以下两个条件:
(1) 有且仅有一个根结点;
(2) 其余的结点分成两棵互不相交的左子树

二叉树的特点:如果二叉树的根结点只有一棵子树,必须明确区分它是左子树还是右子树,因为两者将构成不同形态的二叉树。
二叉树的五种基本形态
空树 、只含根节点 、 右子树为空 、 左子树为空 、 左右子树均不为空

思考按照二叉树的定义,具有3个结点的二叉树有几种?

答案:5种
在这里插入图片描述

二叉树的性质

性质1 在二叉树的第i层上至多有2∧(i-1)个结点。(i>=1)
可用归纳法证明:
在这里插入图片描述
第一层:2∧(0)=1 个
第二层:2∧(1)=2 个
第三层:2∧(2)=4 个

第n层: 2∧(i-1) 个

**性质2:**深度为k的二叉树至多有2∧k-1个结点(k>=1)
同样可用上述方法证明,
2∧0+2∧1+ ……+2∧(k-1 )= 2∧k-1
性质 3 :对任何一棵二叉树,若它含有n₀ 个叶子结点、n₂个度为 2 的结点,则必存在关系式:n₀= n₂+1。

证明:设二叉树上结点总数 n=n₀+n₁+n₂
又因为二叉树上分枝数b=n₁+2n₂
分支数b=n-1=n₀+n₁+n₂-1
由此 n₀= n₂+1

【例】二叉树中叶子结点数为25,仅有一个孩子的结点数为30,则总结点数为
n₀=25 ,n₁=30
所以n₂=n₀+1=26
n=n₀+n₁+n₂=25+30+26=81

现在介绍两类特殊的二叉树
满二叉树:指的是深度为k且含有2 ᵏ-1个结点的二叉树
特点:
(1)每一层上结点数都达到最大
(2)度为1的结点n₁=0,树叶都在最下一层,满二叉树结点层序编号方法:从根结点起从上到下逐层(层内从左到右)对二叉树的结点进行连续编号。
在这里插入图片描述
完全二叉树:树中所含的 n 个结点和满二叉树中编号为 1 至 n 的结点一 一对应。(不能有断点)
在这里插入图片描述
在这里插入图片描述
特点
(1)满二叉树一定是完全二叉树,反之不成立。
(2)在完全二叉树中,若某个结点没有左孩子,则它也一定没有右孩子,即该结点必是叶子结点。
(3)完全二叉树结点数n满足2∧(k-1)-1<n<=2∧k-1
性质4:具有n个结点的完全二叉树的深度为
在这里插入图片描述
证明:设完全二叉树的深度为k,则根据性质(3)完全二叉树结点数n满足2∧(k-1)-1<n<=2∧k-1,可知 k-1<=log2(n)<=k
因为k只能是整数,因此,k=
在这里插入图片描述
性质5
如果对一棵有n个结点的完全二叉树(其深度为⌊log2n⌋ +1)的结点按层序编号(从第1层到第⌊log2n⌋ +1层,每层从左到右),则对任一结点i(1≤i≤n),有:
(1) 若 i=1,则该结点是二叉树的根,无双亲,否则,编号为 ⌊i/2⌋的结点为其双亲结点;
(2) 若 2i>n,则该结点无左孩子,否则,编号为 2i 的结点为其左孩子结点;
(3) 若 2i+1>n,则该结点无右孩子结点,否则,编号为2i+1 的结点为其右孩子结点。
在这里插入图片描述

二叉树的存储结构

顺序存储
用一组地址连续的存储单元,以层次顺序存放二叉树的数据元素,结点的相对位置蕴含着结点之间的关系。
在这里插入图片描述
在这里插入图片描述
二叉树顺序存储结构适用于完全二叉树。
若存储非完全二叉树时有可能对存储空间造成极大的浪费:在最坏的情况下,一个深度为K且只有K个结点的右单支树需要
2 ᵏ-1个结点存储空间(相当于满二叉树所需空间)。
深度为K,且只有K个结点的左单支树需要多少个结点的存储空间?
2ᵏ⁻ ¹

链式存储
一个结点包括三个部分 依次为:左孩子(lchild) 数据域(data) 右孩子(rchild)
如下图:
在这里插入图片描述
在这里插入图片描述
说明:一个二叉链表有根指针root唯一确定。若二叉树为空,则root=NULL;若结点的某个孩子不存在,则相应的指针为空。
具有n个结点的二叉链表中,共有2n个指针域。其中只有n-1个用来指示结点的左右孩子,其余的n+1个指针域为空。可自行推理一遍

为了方便表示双亲,可以在每个结点再加一个指向双亲结点的指针parent构成三叉链表
三叉链表
如下图:
在这里插入图片描述
在这里插入图片描述

二叉树的遍历

先中后遍历

在这里插入图片描述
DLR–先序遍历
LDR–中序遍历
LRD–后序遍历

先序的遍历算法:
若二叉树为空树,则空操作;否则,
(1)访问根结点;
(2)先序遍历左子树;
(3)先序遍历右子树。
中序的遍历算法:
若二叉树为空树,则空操作;否则,
(1)中序遍历左子树;
(2)访问根结点;
(3)中序遍历右子树。
后序的遍历算法
若二叉树为空树,则空操作;否则,
(1)后序遍历左子树;
(2)后序遍历右子树;
(3)访问根结点。
题目
在这里插入图片描述
先序:ABCDEF
中序:BCADFE
后序:CBFEDA

由遍历建树

只知道一种方式的遍历是建不了树的,至少需要两种遍历方式的遍历
比如

由-先序遍历:a b c d e f g
—中序遍历:c b d a e g f 建树
1,由先序可知 a 为根节点,再由中序可知 c b d 为左子树 ,e g f 为右子树
2,再由先序可知b为左子树的根节点,e为右子树的根节点,,再由中序可知c为左子树的左孩子,d为左子树的右孩子;e为右子树的左孩子,f为右子树的右孩子

然后,根据分析建树就好了!!!

再举一例
中序遍历 c g b a h e d j f i
后序遍历 g b c h e j i f d a
1,先由,中序遍历可知a为根节点 再由中序可知cgb为左子树,hedjfi为右子树,再由后序可知左子树的根结点为c,右子树的根为d
2,再由中序可知左子树无右孩子,但是有右子树gb,右子树既有做左子树he又有右子树jfi,有后序可知gb,he,jfi,的根分别为b,e,f
3,再由中序可知,g为gb的左孩子,h为e的左孩子,j为jfi的左孩子i为jfi的右孩子

然后,建树!

二叉树的层次遍历算法

所谓二叉树的层次遍历,是指从二叉树的第一层(根结点)开始,从上至下逐层遍历,在同一层中,则按从左到右的顺序对结点逐个访问。

题目
写出此二叉树的层次遍历序列
在这里插入图片描述
答案:A B E C F D G H K

线索二叉树

对二叉树以某种次序遍历使其变为线索二叉树的过程叫做线索化。
线索化的方法:
(1)若结点有左子树,则其lchild域指示其左孩子,否则,令lchild域指示其在某种遍历序列中的直接前驱结点;
(2)若结点有右子树,则其rchild域指示其右孩子,否则,令rchild域指示其在某种遍历序列中的直接后继结点。
如下图:
加图

为了避免混淆还需改变二叉链表的结点结构,增加两个标志域,LTag和RTag。如下所示:

在这里插入图片描述
在这里插入图片描述

由于序列可由不同的遍历方法得到,因此,线索二叉树有先序线索二叉树、中序线索二叉树和后序线索二叉树三种。

题目
在这里插入图片描述
先序:ABCDEF
中序:BCAFED
后序:CBFEDA

二叉树的应用

基本概念

结点的路径长度:从根结点到该结点的路径上分支的数目。
树的路径长度:树中每个结点的路径长度之和。
结点的权:树中结点所赋的数值。
结点的带权路径长度:从根结点到该结点的路径长度和该结点的权值的乘积。
树的带权路径长度WPL定义为:树中所有叶子结点的带权路径长度之和。WPL(T) = ∑wₖlₖ (对所有叶子结点)

最优树的定义

在所有含 n 个叶子结点、并带相同权值的 m 叉树中,必存在一棵其带权路径长度取最小值的树,称为“最优树”
霍夫曼树又称最优二叉树,是一种带权路径长度最短的二叉树


在这里插入图片描述
计算带权路径长度
分别为
WPL=2×2+4×2+5×2+7×2=36
WPL=2×1+2×4+3×5+3×7=46
WPL=7×1+5×2+2×3+4×3=35

由上例可知,完全二叉树不一定是最优二叉树!

构造霍夫曼树

霍夫曼算法以二叉树为例:
(1)根据给定的n个权值{w₁,w₂ ,…,wₙ},构造n课二叉树的集合{T₁,T₂ ,…,Tₙ},其中每颗二叉树中只含一个带权值为wᵢ 的根节点,其左右子树为空;
(2)在 F 中选取其根结点的权值为最小的两棵二叉树,分别作为左、右子树构造一棵新的二叉树,并置这棵新的二叉树根结点的权值为其左、右子树根结点的权值之和;
(3)从F中删去这两棵树,同时加入刚生成的新树;
(4)重复 (2) 和 (3) 两步,直至 F 中只含一棵树为止。
例,已知权值 W={5,6,2,9,7}
(1)8个结点的权值大小如下:

在这里插入图片描述
(2)从19,21,2,3,6,7,10,32中选择两个权小结点。选中2,3。同时算出这两个结点的和5。
在这里插入图片描述

(3)从19,21,6,7,10,32,5中选出两个权小结点。选中5,6。同时计算出它们的和11。
在这里插入图片描述

(4)从19,21,7,10,32,11中选出两个权小结点。选中7,10。同时计算出它们的和17。
(BTW:这时选出的两个数字都不是已经构造好的二叉树里面的结点,所以要另外开一棵二叉树;或者说,如果两个数的和正好是下一步的两个最小数的其中的一个,那么这个树直接往上生长就可以了,如果这两个数的和比较大,不是下一步的两个最小数的其中一个,那么就并列生长。)
在这里插入图片描述

(5)从19,21,32,11,17中选出两个权小结点。选中11,17。同时计算出它们的和28。
在这里插入图片描述

(6)从19,21,32,28中选出两个权小结点。选中19,21。同时计算出它们的和40。另起一颗二叉树。
在这里插入图片描述

(7)从32,28, 40中选出两个权小结点。选中28,32。同时计算出它们的和60。
在这里插入图片描述

(8)从 40, 60中选出两个权小结点。选中40,60。同时计算出它们的和100。 好了,此时哈夫曼树已经构建好了。
在这里插入图片描述
WPL=(19+21+32)×2+(6+7+10)×4+(2+3)×5=266

霍夫曼树的结点的度数为0或2,没有度为1的结点。
且含有n个叶结点的霍夫曼树共有2n-1个结点

结论:
1.当叶子上的权值均相同时,完全二叉树一定是最优二叉树。否则完全二叉树不一定是最优二叉树
2.在最优二叉树中,权值越大的叶子离跟越近
3.最优二叉树的形态不唯一但WPL最小(哈夫曼树并不唯一,但带权路径长度一定是相同的)

霍夫曼编码

利用霍夫曼树可以构造一种不等长的二进制编码,并且构造所得的霍夫曼编码是一种最优前缀编码,即使所传电文的总长度最短。
编码方法:
1,根据权值建立霍夫曼树
2,定义左分支为二进制 1,右分支为二进制 0 (可自由定义)
3,从上到下读数
如下图:
在这里插入图片描述
注意:相同字符的霍夫曼编码不唯一,且相同字符的编码长度并不一定相同,但相同结点构成的霍夫曼树的带权路径长度必定相同

树,森林,二叉树的相互转换

将树转化为等价的二叉树

将树转化为等价的二叉树方法如下:
(1) 加线。凡是下一个兄弟(不包括堂兄弟)就用线连起来。
(2)抹线。除第一个孩子外,均删去孩子到父母的连线。
(3)调整。以树根为轴心,将整棵树按顺时钟方向旋转约45°

也可先转化为孩子兄弟表示法再直接转化成二叉树
在这里插入图片描述
在这里插入图片描述
变换后的关系:(联想孩子兄弟法存储便于理解)
原来树中,父母的第一个子女,在二叉树中变成父母的左子女;
原来树中,结点的下一个兄弟,在二叉树中变成其右子女;
树的根仍为二叉树的根。

二叉树还原为树:

(1)加线。 在各结点的双亲与该结点右链上的每个结点之间加一条连线。
(2)抹线。 抹去二叉树中所有双亲结点与其右孩子之间的连线。
(3)调整。 以二叉树的根结点作为树的根结点,将各结点按照树的层次排列,形成树的结构。
在这里插入图片描述

森林转化为二叉树

1)转换:将森林中的每一棵树转换为相应的二叉树。
2)加线:将各棵转换之后的二叉树的根结点之间加一连线。
3)调整:第一棵二叉树不动,从第二棵二叉树开始,依次把后一棵二叉树的根结点作为前一棵二叉树根结点的右孩子,且将各结点按照二叉树的层次排列,形成二叉树的结构

二叉树还原为森林

将二叉树还原为森林的方法如下:
1)抹线 抹去二叉树根结点右链上所有结点之间的连线,分成若干个以右链上的结点为根结点的二叉树。
2)转换 将分好的各二叉树还原为树。
3)调整 将还原后的树的根结点排列成一排在这里插入图片描述

欢迎指错!!!

(1)非递归定义 (tree)是由n(n≥0)个结点组成的有限集合。n=0的称为空;n>0的T: ① 有且仅有一个结点n0,它没有前驱结点,只有后继结点。n0称作的根(root)结点。 ② 除结点外n0 , 其余的每一个结点都有且仅有一个直接前驱结点;有零个或多个直接后继结点。 (2)递归定义 一颗大分成几个大的分枝,每个大分枝再分成几个小分枝,小分枝再分成更小的分枝,… ,每个分枝也都是一颗,由此我们可以给出的递归定义。 (tree)是由n(n≥0)个结点组成的有限集合。n=0的称为空;n>0的T: ① 有且仅有一个结点n0,它没有前驱结点,只有后继结点。n0称作的根(root)结点。 ② 除根结点之外的其他结点分为m(m≥0)个互不相交的集合T0,T1,…,Tm-1,其中每个集合Ti(0≤i<m)本身又是一棵树,称为根的子(subtree)。 2、掌握的各种术语: (1) 父母、孩子与兄弟结点 (2) 度 (3) 结点层次、的高度 (4) 边、路径 (5) 无序、有序 (6) 森林 3、二叉树的定义 二叉树(binary tree)是由n(n≥0)个结点组成的有限集合,此集合或者为空,或者由一个根结点加上两棵分别称为左、右子的,互不相交的二叉树组成。 二叉树可以为空集,因此根可以有空的左子或者右子,亦或者左、右子皆为空。 4、掌握二叉树的五个性质 5、二叉树的二叉链表存储。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值