1:
数据结构与算法
树
2:
报告人:XXX
树
目标
二叉树
哈夫曼树
本章目标
树的定义和常用术语
树的存储表示
二叉树、满二叉树和完全二叉树的定义
二叉树的性质和存储表示
二叉树的遍历操作及其应用
哈夫曼树的构造方法及其实现
3:
01
第一节 树
The first chapter
内容展示
4:
报告人:XXX
目标
树
二叉树
哈夫曼树
1 树
1.1 树的定义和常用术语
你见过家族谱系图吗?试以图形表示从你的祖父起的家族成员关系。
祖父
伯父
父亲
叔父
堂兄
堂姐
你
侄儿
堂弟
这类图形正是本章要讨论的“树”结构。
5:
报告人:XXX
目标
树
二叉树
哈夫曼树
1 树
1.1 树的定义和常用术语
树是由n(n≥0)个结点所构成的有限集合,当n=0时,称为空树;当n>0时,n个结点满足以下条件:
⑴ 有且仅有一个称为根的结点。
⑵ 其余结点可分为m(m≥0)个互不相交的有限集合,且每一个集合又构成一棵树,这棵树称为是根结点的子树。
B的集合=[B,D,G,H,I]
C的集合=[C,E,F,J]
6:
报告人:XXX
目标
树
二叉树
哈夫曼树
1 树
1.1 树的定义和常用术语
每个结点都只有有限个子结点或无子结点;
没有父结点的结点称为根结点;
每一个非根结点有且只有一个父结点;
除了根结点外,每个子结点可以分为多个不相交的子树
树里面没有环路(cycle)
树的特点:
7:
报告人:XXX
目标
树
二叉树
哈夫曼树
1 树
1.1 树的定义和常用术语
树里面没有环路:
图1
图2
图3
下图是树吗?
8:
报告人:XXX
目标
树
二叉树
哈夫曼树
1 树
1.1 树的定义和常用术语
树里面没有环路:
图4
图5
下图是树吗?
9:
报告人:XXX
目标
树
二叉树
哈夫曼树
1 树
1.1 树的定义和常用术语
树的结点:
“树”这种数据结构真的很像我们现实生活中的“树”,这里面每个元素我们叫作“结点”;用来连线相邻结点之间的关系,我们叫作“父子关系”。
左图:结点 B 是结点 C D E 的父结点,C D E 就是 B 的子结点,C D E 之间称为兄弟结点,我们把没有父结点的 A 结点叫做根结点,我们把没有子结点的结点称为叶子结点如:F G H I K L 均是叶子结点。
10:
报告人:XXX
目标
树
二叉树
哈夫曼树
1 树
1.1 树的定义和常用术语
树的常用术语:
结点:
结点的度:
树的度:
叶子结点:
分支结点:
数据元素
结点所拥有子树的数目
树中所有结点的度的最大值
度为零的结点
度大于零的结点
D
H
I
J
M
分支:
根和子树根之间的连线(边)
结点的路径:
由从根到该结点所经分支和结点构成
11:
报告人:XXX
目标
树
二叉树
哈夫曼树
1 树
1.1 树的定义和常用术语
树的常用术语:
孩子结点、双亲parent结点、兄弟结点、
堂兄弟结点、祖先结点、子孙结点
结点的层次:
树的深度:
树中所有结点层次数的最大值加1。
A
B
C
D
E
F
G
H
I
J
M
K
L
规定根结点的层次为0,则其它结点的层次是其双亲结点的层次数加1。
12:
报告人:XXX
目标
树
二叉树
哈夫曼树
1 树
1.1 树的定义和常用术语
树的重点常用术语: 高度(Heignt),深度(Depth),层(Level)
结点的高度:结点到叶子结点的最长路径(边数),所有叶子结点的高度为 0。
结点的层次:规定根的层次为 0,其余由父结点层次+1
结点的深度:层次+1
树的高度:根结点的高度
13:
报告人:XXX
目标
树
二叉树
哈夫曼树
1 树
1.1 树的定义和常用术语
树的常用术语:
森林:
由m(m≥0)棵互不相交的树所构成的集合。
B
C
D
E
F
G
H
I
J
M
K
L
14:
第二章节:二叉树
The second chapter
内容展示
02
15:
报告人:XXX
树
二叉树
目标
哈夫曼树
2 二叉树
2.1 二叉树的定义
二叉树的定义:
二叉树,顾名思义,每个结点最多有两个“叉”,也就是两个子结点,分别是左子结点和右子结点。不过,二叉树并不要求每个结点都有两个子结点,有的结点只有
左子结点,有的结点只有右子结点。当然二叉树也可以为空树。
如下图所示均是二叉树:
图1
图2
图3
16:
树
二叉树
目标
哈夫曼树
2 二叉树
2.1 二叉树的定义
二叉树五种基本形态:
N
空树
只含根结点
N
N
N
L
R
R
右子树为空树
L
左子树为空树
左右子树均不为空树
17:
报告人:XXX
树
二叉树
目标
哈夫曼树
2 二叉树
2.1 二叉树的定义
满二叉树的定义:
图2
叶子结点全都在最底层,除了叶子结点之外,每个结点都有左右两个子结点,
这种二叉树就叫作满二叉树。
18:
树
二叉树
目标
哈夫曼树
2 二叉树
2.1 二叉树的定义
完全二叉树的定义:
图3
叶子结点都在最底下两层,最后一层的叶子结点都靠左排列,并且除了最后
一层,其他层的结点个数都要达到最大,这种二叉树叫作完全二叉树。
19:
树
二叉树
目标
哈夫曼树
2 二叉树
2.1 二叉树的定义
下图是完全二叉树吗?
图1
图2
图3
图4
T1 是完全二叉树,T2,T3,T4 均不是完全二叉树
20:
树
二叉树
目标
哈夫曼树
2 二叉树
2.1 二叉树的定义
单分支树的定义:
左支树:
左支树
右支树
右支树:
所有结点都没有右孩子的二叉树。
所有结点都没有左孩子的二叉树。
A
B
C
D
A
B
C
D
21:
树
二叉树
目标
哈夫曼树
2 二叉树
2.2 二叉树的性质
性质1:
在二叉树的第 i 层上至多有2i 个结点。(i≥0)
22:
树
二叉树
目标
哈夫曼树
2 二叉树
2.2 二叉树的性质
性质2:
深度为 h (h≥1)的二叉树上至多含 2h-1 个结点。
23:
树
二叉树
目标
哈夫曼树
2 二叉树
2.2 二叉树的性质
性质3:
对于任何一棵二叉树,若其叶结点的个数为n0 ,度为2的结点个数为n2,则有n0 = n2+1 。
24:
树
二叉树
目标
哈夫曼树
2 二叉树
2.2 二叉树的性质
性质4:
具有 n 个结点的完全二叉树的深度为 log2n +1 或 log2(n+1) 。
25:
树
二叉树
目标
哈夫曼树
2 二叉树
2.2 二叉树的性质
性质5:
若对含 n 个结点的完全二叉树从上到下且从左至右进行 0至 n-1 的编号,则对完全二叉树中任意一个编号为 i 的结点,有:
(1) 若 i=0,则该结点是二叉树的根,无双亲,否则,编号为 (i-1)/2 的结点为其双亲结点;
(2) 若 2i+1≥n,则该结点无左孩子,否则,编号为 2i+1 的结点为其左孩子结点;
(3) 若 2i+2≥n,则该结点无右孩子结点,否则,编号为2i+2 的结点为其右孩子结点。
26:
树
二叉树
目标
哈夫曼树
2 二叉树
2.3 二叉树的存储结构
二叉树的存储结构:
2.二叉树的链式存储结构
1.二叉树的顺序存储结构
27:
树
二叉树
目标
哈夫曼树
2 二叉树
2.3 二叉树的存储结构
完全二叉树的顺序存储结构:
用一组地址连续的存储单元从根结点开始依次自上而下,并按层次从左到右存储完全二叉树上的各结点元素,即将完全二叉树编号为i的结点元素存储在下标为i数组元素中。
0
1
2
3
4
5
6
7
8
9
a b c d e f g h i j
a
b
c
d
e
f
g
h
i
j
0
1
2
3
4
5
6
7
8
9
28:
树
二叉树
目标
哈夫曼树
2 二叉树
2.3 二叉树的存储结构
非完全二叉树的顺序存储结构:
先在树中增加一些并不存在的虚结点并使其成为一棵完全二叉树,然后用与完全二叉树相同的方法对结点进行编号,再将编号为i的结点的值存放到数组下标为i的数组单元中,虚结点不存放任何值。
A
B
C
D
E
F
1
4
0
13
2
6
A B D C E F
0 1 2 3 4 5 6 7 8 9 10 11 12 13
问:一个深度为 k 且只有 k 个结点的右支树需要的数组存储单元为多少?
顺序存储仅适用于满或完全二叉树。
29:
树
二叉树
目标
哈夫曼树
2 二叉树
2.3 二叉树的存储结构
二叉树的链式存储结构:二叉链表
root
lchild data rchild
结点结构:
A
C
F
B
D
G
E
30:
树
二叉树
目标
哈夫曼树
2 二叉树
2.3 二叉树的存储结构
二叉树的链式存储结构:三叉链表
parent lchild data rchild
结点结构:
A
D
E
B
C
F
root
31:
树
二叉树
目标
哈夫曼树
2 二叉树
2.4 二叉树的遍历
二叉树的遍历方法:
层次遍历方法
DLR(先根遍历)
LDR(中根遍历)
LRD(后根遍历)
DRL;RDL;RLD
32:
树
二叉树
目标
哈夫曼树
2 二叉树
2.4 二叉树的遍历
二叉树的层次遍历:
若二叉树为空,则为空操作;否则,按自上而下先访问第0层的根结点,然后再从左到右依次访问各层次中的每一个结点。
A
B
C
D
E
F
H
G
K
层次遍历序列:
ABECFDGHK
33:
树
二叉树
目标
哈夫曼树
2 二叉树
2.4 二叉树的遍历
二叉树的先根(先序)遍历:
若二叉树为空树,则空操作;否则,
(1)访问根结点;
(2)先根遍历左子树;
(3)先根遍历右子树。
A
B
C
D
E
F
H
G
K
先根遍历序列:
ABCDEFGHK
34:
树
二叉树
目标
哈夫曼树
2 二叉树
2.4 二叉树的遍历
二叉树的中根(中序)遍历:
若二叉树为空树,则空操作;否则,
(1)中根遍历左子树;
(2)访问根结点;
(3)中根遍历右子树。
A
B
C
D
E
F
H
G
K
中根遍历序列:
BDCQEHGKF
35:
树
二叉树
目标
哈夫曼树
2 二叉树
2.4 二叉树的遍历
二叉树的后根(后序)遍历:
若二叉树为空树,则空操作;否则,
(1)后根遍历左子树;
(2)后根遍历右子树;
(3)访问根结点。
A
B
C
D
E
F
H
G
K
后根遍历序列:
DCBHKGFE
36:
第三节:哈夫曼树
The third chapter
内容展示
02
37:
树
哈夫曼树
目标
二叉树
3 哈夫曼树
3.1 哈夫曼树的基本概念
哈夫曼树的基本概念
结点的路径长度:
结点间的路径:
从一个结点到另一个结点所经历的结点和分支序列。
从根结点到该结点的路径上分支的数目。
结点的权:
在实际应用中,人们往住会给树中的每一个结点赋予一个具有某种实际意义的数值,这个数值被称为该结点的权值。
38:
树
哈夫曼树
目标
二叉树
3 哈夫曼树
3.1 哈夫曼树的基本概念
哈夫曼树的基本概念
树的带权路径长度:
结点的带权路径长度:
结点的路径长度与该结点的权值的乘积。
树中所有叶结点的带权路径长度之和 。
假设树上有 n 个叶结点,通常记作:
其中Li为带权 wi的叶子结点的带权路径长度。
39:
树
哈夫曼树
目标
二叉树
3 哈夫曼树
3.1 哈夫曼树的基本概念
哈夫曼树的基本概念
最优二叉树:
给定n个权值并作为n个叶结点按一定规则构造一棵二叉树,使其带权路径长度达到最小值,则这棵二叉树被称为最优二叉树。也称哈夫曼树。
在所有含 n 个叶子结点、并带相同权值的 二叉树中,必存在一棵其带权路径
长度取最小值的树,这树就是“最优树”。
40:
树
哈夫曼树
目标
二叉树
3 哈夫曼树
3.1 哈夫曼树的基本概念
哈夫曼树的基本概念
2
7
5
4
9
WPL(T)= 72+52+23+43+92 =60
WPL(T)= 74+94+53+42+21 =89
7 9
2
5
4
对应权值
41:
树
哈夫曼树
目标
二叉树
3 哈夫曼树
3.2 构造哈夫曼树
哈夫曼树的算法
(1) 根据给定的 n 个权值 {w1, w2, …, wn}, 构造 一个由n 棵二叉树所构成的森林 F = {T1, T2, … , Tn},其中每一棵二叉树只有一个根结点,并且根结点的权值分别为w1, w2, …, wn。
(2)在二叉树森林F中选取根结点的权值最小和次小的两棵二叉树,分别把它们作为左子树和右子树去构造一棵新二叉树,新二叉树的根结点权值为其左、右子树根结点的权值之和。
(3) 作为新二叉树的左、右子树的这两棵二叉树从森林F中删除,同时加入刚生成的新二叉树;
(4) 重复 (2) 和 (3) 两步,直至 F 中只含一棵二叉树为止,则这种棵二叉树就是所构成的哈夫曼树。
42:
树
哈夫曼树
目标
二叉树
3 哈夫曼树
3.2 构造哈夫曼树
哈夫曼树的算法
9
例如: 已知权值 W={ 5, 6, 2, 9, 7 }
5
6
2
7
5
2
7
6
9
7
6
7
13
9
5
2
7
43:
树
哈夫曼树
目标
二叉树
3 哈夫曼树
3.2 构造哈夫曼树
哈夫曼树的算法
6
7
13
9
5
2
7
9
5
2
7
16
6
7
13
29
0
0
0
0
1
1
1
1
00
01
10
110
111
哈夫曼码
9
5
2
7
16
44:
树
哈夫曼树
目标
二叉树
3 哈夫曼树
3.2 构造哈夫曼树
用哈夫曼树进行译码
指的是,任何一个字符的编码都不是同一字符集中另一个字符的编码的前缀。
前缀编码:
哈夫曼编码是一种前缀码。
从哈夫曼树的根开始,从左到右把二进制编码的每一位进行判别,若遇到0,则选择左分支走向下一个结点;若遇到1,则选择右分支走向下一个结点,直至到达一个树叶结点,便求得相应字符。
译码过程是编码过程的逆过程:
45:
树
哈夫曼树
目标
二叉树
3 哈夫曼树
3.2 构造哈夫曼树
哈夫曼树的算法
46:
树
哈夫曼树
目标
二叉树
3 哈夫曼树
3.2 构造哈夫曼树
哈夫曼树的算法
47:
树
哈夫曼树
目标
二叉树
3 哈夫曼树
3.1 哈夫曼树的基本概念
哈夫曼树的基本概念
48:
树
哈夫曼树
目标
二叉树
3 哈夫曼树
3.1 哈夫曼树的基本概念
哈夫曼树的基本概念
49:
树
哈夫曼树
目标
二叉树
2 二叉树
2.4 哈夫曼树及哈夫曼编码
二叉树的层次遍历:
50:
树
哈夫曼树
目标
二叉树
2 二叉树
2.4 哈夫曼树及哈夫曼编码
二叉树的层次遍历:
51:
树
哈夫曼树
目标
二叉树
2 二叉树
2.4 哈夫曼树及哈夫曼编码
二叉树的层次遍历:
52:
树
哈夫曼树
目标
二叉树
2 二叉树
2.4 哈夫曼树及哈夫曼编码
二叉树的层次遍历:
53:
树
哈夫曼树
目标
二叉树
2 二叉树
2.4 哈夫曼树及哈夫曼编码
二叉树的层次遍历:
54:
树
哈夫曼树
目标
二叉树
2 二叉树
2.4 哈夫曼树及哈夫曼编码
二叉树的层次遍历:
55:
树
哈夫曼树
目标
二叉树
2 二叉树
2.4 哈夫曼树及哈夫曼编码
二叉树的层次遍历:
56:
树
哈夫曼树
目标
二叉树
2 二叉树
2.4 哈夫曼树及哈夫曼编码
二叉树的层次遍历:
57:
树
哈夫曼树
目标
二叉树
2 二叉树
2.4 哈夫曼树及哈夫曼编码
二叉树的层次遍历:
58:
Thank You!
力学笃行 志存高远