软考(中级)软件设计师核心笔记(8)数据结构——树与二叉树
2026/8/14 1:37:00 网站建设 项目流程

三、树与二叉树

1、树

1.定义:树的定义是递归,它表明了树本身的固有特性,也就是一棵树由若干子树构成,而子树又由更小的子树构成

2.概念:根节点、叶子节点,父子节点,兄弟节点(同一层次的节点),节点度(某一节点子树的个数),树度(对于整棵树而言,各节点度的最大值),分支节点(非终端节点,度不为0的节点),层次(根为第一层,以此类推),树的高度(最大层次树)

2、二叉树

(1):定义

二叉树是n(n >= 0)个节点的有限集合,空树n为0,或是由一根节点及两颗不相交的切分别左右对称的二叉子树所构成,具有递归性。树度与节点度都为2

n个节点的二叉树,高度最高为n,最低为log2n+1(log2n表示n是2的多少次幂)

设:二叉树的节点个数为7,其树高度最高为7(单支树),高度最低为log2^7+1即(2^2

(2):存储

)1.数组顺序存储

补充成满二叉树后,存储在数组中,根据节点编号,即可还原成树

存储在数组当中

编号

1

2

3

4

5

6

7

1

2

3

-

-

4

-

)2.链式存储

1.二叉链式存储:结构:左节点指针、值与编号、右节点指针

当二叉树有k个节点时,节点中必定有k+1个空子节点指针

2.三叉链式存储:结构:左节点指针、值与编号、右节点指针、父节点编号

(3):特性

)1.节点

在二叉树的第i层上(i>=1),最少有1个节点,最多有2^(i-1)个节点

)2.高度

高度为k的二叉树(k>=1),最多有2^k-1个节点

)3.编号

如果对一棵有n个节点的完全二叉树编号,从第1层到log2n+1层,每层从左到右(1

1.如果i=1,则i无父节点,是二叉树的根

2.如果i>1,则父节点是 i/2(除不通则向下取整)

3.如果2i>n,则其节点为叶子节点,无左子节点

4.如果2i

5.如果2i+1>n,则其节点为叶子节点,无右子节点

6.如果2i+1

)4.形态数

递增公式:A[n] = ∑m=0,m

1.0个节点的二叉树形态只有一种:空树

2.1个节点的二叉树形态只有一种:单节点树

3.2个节点的二叉树形态:套入公式 A[2] = ∑m=0,m

快速计算:

4.3个节点的二叉树形态:套入公式 A[3] = ∑m=0,m

快速计算:

5.4个节点的二叉树形态:套入公式 A[4] = ∑m=0,m

快速计算:

A[0]有1种形态,A[1]有1种形态,A[2]有2种形态,A[3]有5种形态

)5.分支(枝丫)数

对任何一颗二叉树,如果其叶子节点数为n0(度为0),度为2的节点树为n2,则n0=n2+1

1.一棵树,从根向叶子伸展,根据度的定义:节点(不包含根节点)数为k,则伸展枝丫数为k

枝丫数:n0*0+n1*1+n2*2+···+nk*k

2.一棵树,从叶子向根回溯,根据父子关系:每个节点都会通过1根枝丫,与其父节点连接,除了根节点

枝丫数:节点总数-1=(n0+n1+n2+···+nk)-1

3.二叉树:度为2,(n0+n1+n2)-1 = n0*0+n1*1+n2*2 等同于 n0=n2+1

设:已知树T的度为4,度为4的节点数有7个,度为3的节点数有5个,度为2的节点数有8个,度为1的节点数有10个

n0

?

n1

10

n2

8

n3

5

n4

7

求节点总数:套入伸展公式:n0*0+n1*1+n2*2+···+nk*k = 1*10+2*8+3*5+4*7 = 10+16+15+28 = 69

求叶子节点数(度为0):套入叶子回溯公式:节点总数-1=(n0+n1+n2+···+nk)-1 = 69=(n0+10+8+5+7)-1 = n0=69-(10+8+5+7)+1 = n0=40

(4):遍历

)1.遍历方式

1.前序遍历:递归遍历,遍历顺序 根 =》左子树 =》右子树

遍历结果:1,2,4,5,7,8,3,6

2.中序遍历:递归遍历,遍历顺序 左子树 =》根 =》右子树

遍历结果:4,2,7,8,5,1,3,6

3.后序遍历:递归遍历,遍历顺序 左子树 =》右子树 =》根

遍历结果:4,8,7,5,2,6,3,1

4.层次遍历:逐层遍历

遍历结果:1,2,3,4,5,6,7,8

)2.反向构造

方法:

第一步:先根据前序和中序,将根区分出来,并划分左右子树

第二步:再根据子树将新的根划分出来,直至还原

设:前序序列:ABHFDECG,中序序列:HBEDFAGC,推算还原二叉树

思路:

1.通过前序得出A为根

2.已知A为根,通过中序得出HBEDF为左子树,GC为右子树

A

HBEDF

GC

3.已知HBEDF为左子树,通过前序ABHFDECG得出B为左子树根节点

A

B

GC

HEDF

4.已知B为左子树根节点,通过中序HBEDFAGC得出H在B之前并且H是中序中第一个节点,说明H在B左侧并且H下再没有子树

A

B

GC

H

EDF

5.已知H为B的左子树,并且EDF非H下子树,通过前序得出ABHFDECG,F为B的右子树

A

B

GC

H

F

DE

6.已知DE为F下的子树,通过中序HBEDFAGC得出,F为最后,说明ED并非F的右子树,E在D前表示E为D的左子树,并通过前序ABHFDECG可验证左子树是否准确

A

B

GC

H

F

D

E

7.已知A为根节点,BHFDE为左子树,通过前序ABHFDECG得出C为根节点

A

B

C

H

F

G

D

E

8.已知C为根节点,通过中序HBEDFAGC得出:G为C的左子树

A

B

C

H

F

G

D

E

(5):排序

左子树小于根,右子树大于根,第一个值为根

从左到右排列同一个层次的节点,其关键字呈现有序排列的特点

最大高度值n

最小高度值(满二叉树)[log2n]+1

设:待排序序列:{89, 48, 112, 20, 56, 51}

89

48

112

20

56

51

)1.查找节点

查找关键字:左子树小于根,右子树大于根

如查找关键字56,小于根节点89得出在左侧 =》小于左子树根节点48得出在右侧,得出结果

)2.插入节点

1.若该键值节点已存在,则不再插入

2.若查找二叉树为空树,则以新节点为查找二叉树(单节点树)

3.将要插入节点键值与插入后父节点键值比较,就能确定新节点是父节点的左子节点还是右子节点

)3.删除节点

1.若待删除节点是叶子节点,则直接删除

2.若待删除节点只有一个叶子节点,则将这个子节点与待删除节点的父节点直接连接

3.若待删除的节点右两个子节点,则在其左子树上,用中序遍历寻找关键值最大节点,并用此节点代替待删除节点

(6):最优二叉树(哈夫曼树)

二叉树代价最小的形态(可以存在多种,只要代价最小即可)

权值越大离根节点越近

哈夫曼树中不存在只有一个子树的节点

哈夫曼树中的节点总数一定为奇数

权值相同的节点到树根的路径长度不一定相同

)1.概念

1.树路径长度:叶子节点到根的枝丫树

2.权(权值):节点当中的数值

3.带权路径长度:权值*树路径长度

4.树带权路径的长度(代价):所有叶子节点带权路径的长度

5.最优二叉树:代价最小

其中:设叶子节点‘3’树路径长度为3,节点当中数值为权值,权值为3的带权路径长度(3*3)为9,树带权路径长度(代价)为4*2+3*3+6*2=29

其中:设叶子节点‘3’树路径长度为2,节点当中数值为权值,权值为3的带权路径长度(3*2)为6,树带权路径长度(代价)为4*2+6*3+3*2=35

综上两图相比:图1比图2代价更小,所以图1为最优二叉树

)2:降低二叉树代价

权值最大的节点,放置根节点

权值最小的节点,放置离根最远的节点

设叶子节点序列{1,2,4,8},最优二叉树表现为:

>例题:叶子节点序列为:5,29,7,8,14,23,3,11,求最优二叉树

解:思路:

1.先将叶子节点序列排序为:3,5,7,8,11,14,23,29

2.先取最小两节点开始拼接,完成后得出子节点序列为:3,5,7,8,11,14,23,29 ==》7,8,8,11,14,23,29

3.7,8,8,11,14,23,29 ==》8,11,14,15,23,29

4.14,15,19,23,29 ==》19,23,29,29

5.19,23,29,29 ==》29,29,42

6.29,29,42 ==》42,58

7.得出根节点:58,42 ==》100

8.拼接所有子树到根节点下,得出

)3:哈夫曼编码

变长、压缩编码

设:某文档5个字符,每个字符出现的频率为下表,并在哈夫曼树中右侧节点表示1,左侧节点表示0

字符

a

b

c

d

e

频率%

40

10

20

16

14

则求得最优二叉树结果为:

根据表格进行转换,替换当中的数字为字母得出:

已知此哈夫曼树右侧节点表示1,左侧节点表示0,则可以得出:

根据上述分析:得出结论:a=0,b=100,c=111,d=110,e=101

定长:a的长度为1位,b/c/d/e的长度均为3位,则平均定长为3

变长:a的长度为40%(使用频率)*1(定长)= 0.4,b~e定长都为3,60%(b~e的使用频率总和为)*3(定长)=1.8,平均变长为 0.4+1.8 = 2.2

压缩比例:(3-2.2)/3 ≈ 0.27 = 27%

(7):特殊的二叉树

)1:平衡二叉树

平衡因子:右侧高度 - 左侧高度

任意节点左右子树的深度相差不超过1

每个节点的平衡因子只能是1,0,-1

)2:线索二叉树

遍历:利用填补空节点,指向遍历的前驱和后继

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询