数据结构算法之 树的应用

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
树的应用
二叉树遍历的应用
1.查找数据元素 2. 求二叉树的高度 3. 求叶子结点数
一、问题的提出(判断树)
设有100个学生某门课程的考试成绩的分布如下表 所示:
学生成绩数据分布情况表
分数 学生比例数 0~59 0.05 60~69 70~79 80~89 90~100 0.15 0.40 0.30 0.10
否则,完成下面的判断:
(i) 若给定的值x小于根结点关键 字的值,查找将按照递归的方式在 左子树上进行。 (ii)若给定的值x大于根结点关键 字的值,查找将按照递归的方式在 右子树上进行。 (iii)重复以上过程,直到查找结束 (成功或者失败)。
50
30
20 40
80
90
35
32
二叉搜索树的建立:
由空集为初始状态,将结点按关键字依次插入 到二叉树中去。先将第一个结点作为二叉树的 根结点,插入其它结点时,若结点的值小于根 结点的值,则插入左子树,否则插入右子树, 该过程依次进行,直到整个过程结束。 动态生成二叉排树时,树的形状、高度不仅依 赖于记录关键字的大小,还与记录输入的先后 顺序有关
译码时,两位一分进行译码,可唯一得到电文: ABACCDA 。
二、哈夫曼树及其应用
思考:如何解 3.哈夫曼编码 决这一问题? ②压缩编码: 问题的关键在于编码 例如:对于刚才的4个字符的编码问题,可以按如 是否为无前缀编码。 下不等长编码方案进行编码:
A: 0 B: 00 C: 1 D: 01 则对于电文“ABACCDA”的二进制电码为: 000011010 总长为9位 问题:译码时可能出现多意性,即译码不唯一。 如000011010中的前4个0的译码会有如下几 种不同译码: 0000→AAAA;0000→ABA; 0000→BB
哈夫曼树的性质
哈夫曼树中没有度为1的结点 一棵有N个叶子的哈夫曼树中有2N-1个结点 给定权值的哈夫曼树不唯一 权值越大的节点离根节点越近
作业:
1.假设用于通信的电文仅由6个字母 {A,B,C,D,E,F} 组成,这6个字母在电文中出现的频率高低依次为: 3,4,5,8,9,4,试为这6个字母设计哈夫曼编码。 2.证明:若哈夫曼树中有n个叶子结点,则该哈夫曼树 中共有2n-1个结点。(提示:哈夫曼树中无度数为 1的结点 )
{70,35,85,20,70,90}
70
{20 ,35, 70 , 70 , 85 ,90}
35 20 70
85
90
20
35
70
70 85 90
查找结点
根据前面的定义可知,二叉搜索树的查 找是一个递归的过程,具体如下: ① 若二叉排序树为空,则查找失败, 输出相关信息。 ② 若二叉查找树不为空,将给定值x 与查找树的根结点关键字进行比较。 ③ 若比较结果为相等,则查找成功, 整个查找结束。
二、哈夫曼树及其应用
2.哈夫曼树的求解过程
①问题:
已知n个叶子的权值为{w1,w2,...wn},构 造一棵最优二叉树。
二、哈夫曼树及其应用
2.哈夫曼树的求解过程
②方法:
步骤1:构造一个具有n棵二叉树的森林 F={T1,T2,......,Tn},其中Ti是只有一个根结点且根结 点的权值为wi的二叉树。 步骤2:在F中选取两棵其根结点的权值最小的二叉树,从 F中删除这两棵树,并以这两棵二叉树为左右子树构造一 棵新的二叉树添加到F中,该新的二叉树的根结点的权值 为其左右孩子二叉树的根结点的权值之和。 步骤3:判断F中是否只有唯一的一棵二叉树。若是,则求 解过程结束;否则,转步骤2。
no a<70 no a<80 no
yes 打印 "pass"
yes
5%的 学生
a<90 打印 "general yes " no 15%的 打印 打印 "good" 学生 40%的 "excellent 30% 的 学生 10% 的 " 学生 学生
学生成绩数据分布情况表
分数 学生比例数 0~59 0.05 60~69 70~79
*问题:现在要编写程序依次根据每个学生的成绩 打印出该学生的成绩等级。
学生成绩数据分布情况表 共做315次比
分数 0~59 60~69 70~79 80~89 90~100 较
学生比例数
读取一个学生成绩→a
0.05
0.15
0.40
0.30
0.10
方法1:
yes 循环一百次 打印 "bad"
a<60
三、实例
已知某通信用电文仅由A、B、C、D这4个字符构成, 其出现的频率分别为:8、4、6、2,请给出它们的哈夫 曼编码,要求写出相应的哈夫曼树。
解:根据哈夫曼算法,求得哈夫曼树如下:
0 A
8 6 20
1 0
12
从根开始到叶子得各字 符的哈夫曼编码如下:
1
6
0 B
4
1
2
C
A :0 B:100
C:11 D:101
15
40 a
30 b
5 c
10 d
15 e
二、哈夫曼树及其应用
2.哈夫曼树的求解过程
③实例:已知有5个叶子结点的权值分别为:5 , 15 , 40 , 30 , 10 ;试画出一棵相应的哈夫曼树。
30
40 a
30 b
15
15 e
5 c
10d
二、哈夫曼树及其应用
2.哈夫曼树的求解过程
③实例:已知有5个叶子结点的权值分别为:5 , 15 , 40 , 30 , 10 ;试画出一棵相应的哈夫曼树。
线索二叉树
当以二叉链表作为存储结构时,只能找到结 点的左,右孩子的信息,而不能直接得到结 点在任一序列中的前驱和后继信息。 如果增加前驱和后继指针,降低存储效率 因为在有n个结点的二杈链表中必定存在 n+1个空链域,故可以利用这些空链域来 存放结点的前驱和后继信息。
结构
left leftThread element rightThread right
n 1 2
85
查找失败
88
查找关键字 == 50 , 35 , 90 , 95
算法分析:
对于深度为d的二叉搜索树,若设第i层有ni个结点 ,则在等查找概率情况下,其平均查找长度为:
ASL=
最好情况下,O(log2n)
1 d i ni n i 1
最坏情况下,O(n)
ASL
1 n i n i 1
种不同形式的二叉树:
7
a
5
b c
2 4
4 d
c d 7 a 5 b
2
7 a 5 b 2 c
4d
二、哈夫曼树及其应用
⑤哈夫曼树的定义:
设有n个叶子结点的二叉树,其第i个 叶子结点的权值为wi(i=1,2,3,...n),且第i个 叶子结点的路径长度为li ,则使 n WPL=∑wi*li最小的二叉树称为“最优 i=1 二叉树”或称为“哈夫曼树”。
60
40 a
30 b 15
30
15 e
5 c
10d
二、哈夫曼树及其应用
2.哈夫曼树的求解过程
100
40 a
60
30 b 15
30
15 e
5 c
10 d
二、哈夫曼树及其应用
3.哈夫曼编码
①等长编码: 以英文字符编码为例,一般英文字符编码是采 用7位二进制数编码(ASCII码)。7位二进制数 可以为27个不同的英文字符编码。 下面为讨论问题简单起见,假设被编码的字符 集中只有4个(即22个)不同字符,故只要两位二 进制数即可完成编码。 设这4个不同的字符为A,B,C,D,则可进 行等长编码如下:
③结点的带权路径长度: 某结点的路径长度与该结点上的权值的乘积称为该结 点的带权路径长度。 ④ 树的带权路径长度(WPL): 树中所有叶子结点的带权路径长度之和称为树的带权 路径长度。
二、哈夫曼树及其应用 树的带权路径长度为:
树的带权路径长度为: 1.哈夫曼树的有关概念 树的带权路径长度为: WPL=2*4+3*7+3*5+ WPL=1*7+2*5+3*2+ 实例:已知某二叉树的四个叶子结点 a,b,c,d WPL=2*7+2*5+2*2+ 1*2=46 3*4=357,5,2, 分别带权 4,则可构造出有如下几 2*4=36
二、哈夫曼树及其应用
3.哈夫曼编码
①等长编码:
设这4个不同的字符为A,B,C,D,则可进 行等长编码如下:
二、哈夫曼树及其应用
3.来自百度文库夫曼编码
①等长编码: 设这4个不同的字符为A,B,C,D,则可进 行等长编码如下: A: 00 B: 01 C: 10 D: 11
则对于电文“ABACCDA”的二进制电码为: 00010010101100 总长为14位
D
则对于电文“ABACCDA”的 二进制电码为: 0100011111010 总长为13位
四、小结:
1.哈夫曼树的引入:程序优化问题。 2.哈夫曼树的定义: n n WPL=∑wi*li最小的二叉树称为“最优二叉树”或 i=1 称 为“哈夫曼树”。 3.哈夫曼树求解的算法思想:3个步骤。 4.哈夫曼树的应用:哈夫曼编码的设计问题。

leftThread=0 时 left指向左儿子; leftThread=1 时 left指向前驱; rightThread=0 时 right指向左子女; rightThread=1 时 right指向后继;
注意:
一是何种“序”的线索化,是先序、中序还是 后序; 二是要“前驱”线索化、“后继”线索化还是“ 全”线索化(前驱后继都要); 三是只有空指针处才能加线索。
二、哈夫曼树及其应用
3.哈夫曼编码
③无前缀压缩编码(既哈夫曼编码): *思想:利用哈夫曼树设计出来的不等长的编码方 案一定是无前缀的。 *方法:
步骤1:将各字符按照其“出现频率”的统计数字安排 一个“权值”并作为“叶子”,并求出相应的哈夫曼树;
步骤2:树中各结点到其左孩子的边上的权值设为0、到 其右孩子的边上的权值设为1(即所谓左0右1); 步骤3:从根开始到“叶子”所经历的边上的数值的序 列即为该“叶子”所对应的字符的编码。
共做220次 80~89 90~100 比较
0.10
方法2:
循环一百次 a<70
0.15 0.40 0.30 读取一个学生成绩 →a yes no a<80 no yes 打印 “good " 30%的 学生
yes yes 打印 "bad" 5%的 学生 a<60
a<90
no
打印 no "general " 打印 40%的 "pass" 学生 15%的 学生
二叉搜索树
二叉搜索树又称为二叉排序树,其定义 是一个递归过程:
它或者是一棵空树;或者是具有下列性质 定义的二叉树: ⑴ 若左子树不空,则左子树上所有结 点的值均小于根结点的值;若右子树不 空,则右子树上所有结点的值均大于或 等于根结点的值。
⑵ 左右子树都分别是一棵二叉搜索树 。
中序遍历二叉搜索树可以得到解决一个按关 键字有序的序列。 构造二叉搜索树的目的不是为了排序,而是 用来加速查找。
打印 "excellent " 10%的 学生
思考:如何找到一棵最优的判断树使得编写 出来的程序的运行时间是最高效的?
二、哈夫曼树及其应用
1.哈夫曼树的有关概念
①结点的路径长度: 从根结点沿某条路径到某结点途中所经历的边的条数 称为该结点的路径长度。
② 树的路径长度: 从根结点到每一个叶子结点的路径长度之和。
二、哈夫曼树及其应用
2.哈夫曼树的求解过程
③实例:已知有5个叶子结点的权值分别为:5 , 15 , 40 , 30 , 10 ;试画出一棵相应的哈夫曼树。
15
40 a
30 b
5 c
10d
15 e
二、哈夫曼树及其应用
2.哈夫曼树的求解过程
③实例:已知有5个叶子结点的权值分别为:5 , 15 , 40 , 30 , 10 ;试画出一棵相应的哈夫曼树。
相关文档
最新文档