当前位置:
文档之家› data structure for 2016(CHP5)
data structure for 2016(CHP5)
遍历二叉树的操作定义 一棵非空的二叉树由3个基本单元组成: 根结点、左子树和右子树。因此,若能依次遍历这3部 分,便是遍历了整个二叉树。 假如以L、D、R分别表示遍历二叉树的左子树、访 问根结点和遍历右子树: 则有:DLR、LDR、LRD、DRL、RDL、RLD 先序(根)遍历:DLR 中序遍历: LDR 后序遍历: LRD
沈阳师范大学软件学院
将一般二叉树转化为完全二叉树的方法是: 在非完全二叉树的“残缺”位置上增设 虚结点即实际不存在该结点)。
二叉树的顺序存储
0 1 2 3 4 5 6 7 8 9 10 a b c d e 0 0 0 0 f g
例:设一二叉树的顺序存储结构如 a 下,试画出二叉树。
b c
单支树 A BC d e D E ^ F ^ ^ G H ^ ^ I J
实现:按满二叉树的结点层次编号,依次存放二叉 树中的数据元素。
沈阳师范大学软件学院
#define MAX_TREE_SIZE 100 // 二叉树的最大结点数 typedef TElemType SqBiTree[MAX_ TREE_SIZE]; // 0号单元存储根结点 SqBiTree bt;
操作结果:中序遍历T,对每个结点访问一次。
PostOrderTraverse(T) 初始条件:二叉树T存在。
操作结果:后序遍历T,对每个结点访问一次。
沈阳师范大学软件学院
树的重要性质 树中的结点数等于所有结点的度数加1 例:在一棵度为3的树中,度为3的结点数为 2个,度为2的结点数为1个,度为1的结点数 为2个,那么度为0的结点数是多少个? 解答:总度数=3*2+2*1+1*2=10
遍历规则
D
ROOT
先左后右 L DLR
LCHILD RCHILD
R RDL RLD
LDR
LRD
DRL
沈阳师范大学软件学院
A B D E 口诀: C
先序遍历:A B D E C 中序遍历:D B E A C 后序遍历:D E B C A
二叉树的五种不同形态
沈阳师范大学软件学院
练习
具有3个结点的二叉树可能有几种不同形态?普通树呢? 5种/2种
沈阳师范大学软件学院
5.3 树和二叉树的抽象数据类型定义 二叉树的抽象数据类型定义
ADT BinaryTree{ 数据对象D: D是具有相同特性的数据元素的集合。 数据关系R: 若D=Φ,则R= Φ ;
K
L
M
沈阳师范大学软件学院
基本术语
结点 ——即树的数据元素 结点的度——结点挂接的子树数 结点的层次 ——从根到该结点的层数(根结点算第一层) 终端结点 ——即度为0的结点,即叶子 分支结点 ——即度不为0的结点(也称为内部结点) 树的度 ——所有结点度中的最大值 层次 树的深度——指所有结点中最大的层数 A (或高度) 1
分析:必有 2n 个链域。除根结 点外,每个结点有且仅有一个 双亲,所以只会有 n - 1 个结点 的链域存放指针,指向非空子 女结点。
空指针数目=2n-(n-1)=n+1
A ^ B
^ C ^ ^ E
D
^ F ^ ^ G ^
沈阳师范大学软件学院
一个二叉链表由头指针root唯一确定,若二 叉树为空,则root=NULL。若结点的某个孩子不 存在,则相应的指针为空。 具有n个结点的二叉树中,一共有2n个指针 域,其中只有n-1个用来指示结点的左、右孩子 ,其余的n+1个指针域为空。
沈阳师范大学软件学院
树是n个结点的有限集
A
B A
C
D
E
F
G
H
I
J
K
L
M
T1
沈阳师范大学软件学院
T2
T3
ห้องสมุดไป่ตู้ 树的其它表示方式
A D K L F C G E B H M J I
A
A B E K L F C G
B C D
嵌套集合
E
D H M
F
G
H
I
J
I J
K
L
M
凹入表示
(A(B(E(K,L),F),C(G),D(H(M),I,J)))
沈阳师范大学软件学院
1 2 4 5 6 3 7 4 2
1 3 5 6 7
8
9
10
11
12
13
14
15
1
2
4 8 9 10 5 11 12 6
3
7 4 2
1
3 5 6
判断:完全二叉树
练习
一棵完全二叉树有5000个结点,可以计算出其叶结 点的个数是( 2500 )。 设二叉树中度为0的叶子结点个数为n0,度为1 结点个数为n1,度为2结点个数为n2,于是有: n0+n1+n2=5000 根据二叉树性质:n0=n2+1,代入有: 2n2+n1+1=5000 由于完全二叉树的n1只能是0或者1,为满足: 2n2+n1+1=5000成立,则n1=1,因此n2=2499 所以n0=2500,即叶子个数是2500个
f g
特点: 结点间关系蕴含在其存储位置中 浪费空间,适于存满二叉树和完全二叉树
沈阳师范大学软件学院
二叉树的链式存储
PARENT
lchild
data
rchild
DATA
lchild
data
parent rchild
LCHILD
RCHILD
沈阳师范大学软件学院
练习
n+1 在n个结点的二叉链表中,有 个空指针域
沈阳师范大学软件学院
(1)对于完全二叉树,按照自上而下、自左向 右的次序存放完全二叉树上的结点元素,即 将完全二叉树上的编号为i的结点元素存储 在一维数组中下标为i-1的分量中。
(2)对于一般二叉树,则应该首先将二叉树“ 转化”为完全二叉树,然后按照完全二叉树 的顺序存储方式将每个结点存储在一维数组 的相应分量中。
沈阳师范大学软件学院
性质4: 具有n个结点的完全二叉树的深度必为 log2n +1
1 2 4 8 9 10 5 11 12 6 3 7
k-1层
k层
2 k 1 1 2k 1
n
2k−1−1<n≤2k−1 或 2k−1≤n<2k k−1≤log2n<k,因为k是整数 所以k = log2n + 1
树(Tree)是n(n≥0)个结点的有限集,它或为空树( n = 0);或为非空树,对于非空树T: (1)有且仅有一个特定的结点称之为根的结点; (2)除根结点以外的其余结点可分为m(m>0)个互不 相交的有限集T1, T2, …, Tm , 其中每一个集合本身又是一棵树 ,并且称为根的子树(SubTree)。
基本术语
双亲 ——即上层的那个结点(直接前驱) 孩子 ——即下层结点的子树的根(直接后继) 兄弟 ——同一双亲下的同层结点(孩子之间互称兄弟) 堂兄弟——即双亲位于同一层的结点(但并非同一双亲) 祖先 ——即从根到该结点所经分支的所有结点 子孙 ——即该结点下层子树中的任一结点
A
B
C
D
E
F
G
H
I
J
沈阳师范大学软件学院
教学目标
1. 掌握二叉树的基本概念、性质和存储结构 2. 熟练掌握二叉树的前、中、后序遍历方法 3. 掌握线索化二叉树的思想 4. 熟练掌握:哈夫曼树的实现方法、构造哈夫曼编码 的方法 5. 了解:森林与二叉树的转换,树的遍历方法
沈阳师范大学软件学院
5.1 树和二叉树的定义
树的定义
沈阳师范大学软件学院
满二叉树和完全二叉树的区别
满二叉树是叶子一个也不少的树,而完全二叉树虽然 前 n-1 层是满的,但最底层却允许在右边缺少连续若 干个结点。满二叉树是完全二叉树的一个特例。
1 2 4 8 9 10 5 11 12 6 13 14 3 7 15 8 4 9 10 2 5 11 12 6 1 3 7
广义表
沈阳师范大学软件学院
基本术语
根 ———即根结点(没有前驱) 叶子 ———即终端结点(没有后继) 森林 ———指m棵不相交的树的集合(例如删除A后的 子树个数) 有序树——结点各子树从左至右有序,不能互换(左为 第一) 无序树——结点各子树可互换位置。
A B C D
E
F
G
H
I
J
K
L
M
沈阳师范大学软件学院
B C D
2
J
E
F
G
H
I
3
K
L
M
4
沈阳师范大学软件学院
二叉树的定义
二叉树(Binary Tree)是n(n≥0)个结点所构成 的集合,它或为空树(n = 0);或为非空树,对于 非空树T: (1)有且仅有一个称之为根的结点; (2)除根结点以外的其余结点分为两个互不相 交的子集T1和T2,分别称为T的左子树和右子树, 且T1和T2本身又都是二叉树。
第5章 树和二叉树
沈阳师范大学软件学院
逻辑结构
集合——数据元素间除“同属于一个集合”外,无其它关系
线性结构——一个对一个,如线性表、栈、队列 树形结构——一个对多个,如树
图形结构——多个对多个,如图
沈阳师范大学软件学院
第5章 树和二叉树
5.1 5.2 5.3 5.4 5.5 5.6 5.7 树和二叉树的定义 案例引入 树和二叉树的抽象数据类型定义 二叉树的性质和存储结构 遍历二叉树和线索二叉树 树和森林 哈夫曼树及其应用
沈阳师范大学软件学院
性质5: 对完全二叉树,若从上至下、从左至右编号,
则编号为i的结点,其左孩子编号必为2i,其右孩子 编号必为2i+1;其双亲的编号必为i/2 。