- 1、本文档共23页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
数据结构教案
第六章 树与二叉树
目 录
6.1 树的定义和基本术语 1
6.2 二叉树 2
6.2.1 二叉树的定义 2
6.2.2 二叉树的性质 4
6.2.3 二叉树的存储结构 5
6.3 树和森林 6
6.4 二叉树的先|中|后序遍历算法 7
6.5 先|后|中序遍历的应用扩展 9
6.5.1 基于先序遍历的二叉树(二叉链)的创建 9
6.5.2 统计二叉树中叶子结点的数目 9
6.5.3 求二叉树的高度 10
6.5.4 释放二叉树的所有结点空间 11
6.5.5 删除并释放二叉树中以元素值为x的结点作为根的各子树 12
6.5.6 求位于二叉树先序序列中第k个位置的结点的值 12
6.5.7 线索二叉树 13
6.5.8 树和森林的遍历 14
6.6 二叉树的层次遍历 16
6.7 判断一棵二叉树是否为完全二叉树 16
6.8 哈夫曼树及其应用 18
6.8.1 最优二叉树(哈夫曼树) 18
6.8.2 哈夫曼编码 19
6.9 遍历二叉树的非递归算法 19
6.9.1 先序非递归算法 19
6.9.2 中序非递归算法 20
6.9.3 后序非递归算法 21
二叉树和树
树的定义和基本术语
树的递归定义
1)结点数n=0时,是空树
2)结点数n0时
有且仅有一个根结点、m个互不相交的有限结点集——m棵子树
基本术语
结点: 叶子(终端结点)、根、内部结点(非终端结点、分支结点);
树的规模:结点的度、树的度、结点的层次、树的高度(深度)
结点间的关系:双亲(1)—孩子(m),祖先—子孙,兄弟,堂兄弟
兄弟间是否存在次序:无序树、有序树
去掉根结点
非空树 森林
引入一个根结点
树的抽象数据类型定义
树特有的操作:
查找:双亲、最左的孩子、右兄弟
结点的度不定,给出这两种操作可以查找到一个结点的全部孩子
插入、删除:孩子
遍历:存在一对多的关系,给出一种有规律的方法遍历(有且仅访问一次)树中的结点
ADT Tree{
数据对象:D={ai | ai∈ElemSet, i=1,2,…,n, n≥0}
数据关系:若D为空集,则称为空树;若D仅含一个数据元素,则R为空集,否则R={H},H是如下二元关系:(1) 在D中存在唯一的称为根的数据元素root,它在关系H下无前驱;(2) 若D-{root}≠Ф,则存在D-{root}的一个划分D1, D2, …, Dm (m0) (Di 表示构成第i棵子树的结点集),对任意j≠k (1≤j, k≤m) 有Dj∩Dk=Ф,且对任意的i (1≤i≤m),唯一存在数据元素xi∈Di, 有root, xi∈H(H表示结点之间的父子关系);(3) 对应于D-{root}的划分,H-{root, x1,…, root, xm}有唯一的一个划分H1, H2, …, Hm(m0)(Hi表示第i棵子树中的父子关系),对任意j≠k(1≤j,k≤m)有Hj∩Hk=Ф,且对任意i(1≤i≤m),Hi是Di上的二元关系,(Di, {Hi})是一棵符合本定义的树,称为根root的子树。
基本操作:
InitTree(T)
操作结果:构造空树T
DestroyTree(T)
初始条件:树T已存在
操作结果:销毁树T
ClearTree(T)
初始条件:树T已存在
操作结果:将树T清为空树
TreeEmpty(T)
初始条件:树T已存在
操作结果:若T为空树,则返回TRUE,否则返回FALSE
TreeDepth(T)
初始条件:树T已存在
操作结果:返回树T的深度
Root(T)
初始条件:树T已存在
操作结果:返回T的根
Value(T, cur_e)
初始条件:树T已存在,cur_e是T中某个结点
操作结果:返回cur_e的值
Assign(T, cur_e, value)
初始条件:树T已存在,cur_e是T中某个结点
操作结果:结点cur_e赋值为value
Parent(T, cur_e)
初始条件:树T已存在,cur_e是T中某个结点
操作结果:若cur_e是T的非根结点,则返回它的双亲,否则函数值为“空”
LeftChild(T, cur_e)
初始条件:树T已存在,cur_e是T中某个结点
操作结果:若cur_e是T的非叶子结点,则返回它的最左孩子,否则返回“空”
RightSibling(T, cur_e)
初始条件:树T已存在,cur_e是T中某个结点
操作结果:若cur_e有右兄弟,则返回它的右兄弟,否则返回“空”
InsertChild(T, p, i, c)
初始条件:树T已存在,p指向T中某个结点,1≤i≤p所指结点的度+1,非空树c与T不相交
操作结果:插入c为T中p所指结点的第i棵子树。
文档评论(0)