软考(中级)软件设计师核心笔记(8)数据结构——树与二叉树

三、树与二叉树

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.形态数

递增公式:An = ∑m=0,m

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

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

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

快速计算:

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

快速计算:

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

快速计算:

A0有1种形态,A1有1种形态,A2有2种形态,A3有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:线索二叉树

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

相关推荐
依然鸣1 小时前
PTA团体程序设计天梯赛L2真题讲解L2-005-008
开发语言·数据结构·c++·算法·深度优先·pat考试·图论
能年玲奈喝榴莲牛奶1 小时前
系统规划与管理师-第一章-考点记忆
大数据·数据库·软考·系统规划与管理师·系规
imaol12 小时前
数据结构--树
数据结构
是上好佳佳佳呀2 小时前
【深度学习|DAY04】神经网络深度学习笔记(下):损失函数、优化器与正则化
笔记·深度学习·神经网络
basketball6162 小时前
软考中级网络工程师 第6章 网络安全 备考总结
大数据·网络·web安全·网络工程师·软考
Tongzhi20262 小时前
通芝科技无感考勤一体机:软硬一体,开箱即用
数据结构·数据库·科技·算法·均值算法·数据库开发
向上的车轮3 小时前
软考「系统规划与管理师(第2版)」「系统科学与哲学方法论」
软考·软考系规·系统科学与哲学方法论
砚凝霜4 小时前
软考网络工程师|第 9 章 网络诊断命令 + 故障工具 + 故障排查完整笔记
网络·笔记
linux-hzh4 小时前
百日算法修炼 · Day 09
数据结构·算法·排序算法