ch06
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
二叉树的5种具体形式如下图6.3所示:
空 树 只有左子树 只有右子树
φ
(a) (b) (c) (d) (e)
图6.3二叉树的基本形态
只有 一个 结点
左,右子 树都存在
出版社
数据结构C语言描述 6.2.1 二叉树的定义及逻辑结构(续)
二叉树的抽象数据类型可以定义如下: ADT binary_tree{ 数据关系R:若D为空集,则为空树。若D中仅含有一个数据 元素,则R=Φ,否则R={H},H是如下的二元关系: ① 在D中存在唯一的称为根的结点root,它在关系H下没有前驱。 ② 除root以外,D中其余结点存在m(0≤m≤2)个不相交的划分, 每个划分都是一棵二叉树,称为根的子树。
2、树的抽象数据类型定义: ADT Tree { 数据对象D:一个集合,该集合中的所有元素具有相 同的特性。 数据关系R:若D为空或D中仅含有一个数据元素,则 R=Φ ,否则R={H},H关系如下:
出版社
6.1 树的逻辑结构和基本操作(续)
关系H下没有前驱。
数据结构C语言描述
① 在D中存在唯一的称为根的数据元素root,它在 ② 除root以外,D中其余结点存在m(m≥0)个不相 交的划分,每个划分都是一棵树,是根的子树。
点的子孙。在图6.1中结点D的子孙是H、I、J、M。
出版社
6.1 树的逻辑结构和基本操作(续)
数据结构C语言描述
祖先:是从该结点开始追溯前驱直到根结点,所经 历的所有结点。图6.2(b)中结点F的祖先是A、B。
树的高度(深度):树中所有结点的层次的最大值。
有序树:在树T中,如果各子树T之间是有先后次
出版社
数据结构C语言描述 6.2.1 二叉树的定义及逻辑结构(续)
LeftChild(bt, x) 求以bt为根的二叉树结点x的左孩子。 若结点x无左孩子或x不
在bt中, 则返回“空”。
RightSibling(bt, x)求以bt为根的二叉树结点x的右孩子。若 结点x无右孩子或x不在bt中, 则返回“空”。 InsertChild(bt, p, child) 以bt为根的二叉树已存在,p指向bt中某个结点,非空树child与 bt不相交。将child子树插入bt,成为p所指向结点的子树。
出版社
6.1 树的逻辑结构和基本操作(续)
数据结构C语言描述
如上面的描述的关系,我们可以用下图6.1来表示:
A
B E K L F C G H M D I
李奶奶
儿子(3个)
J 孙子(6个)
重孙子(3个)
图6.1 李奶奶的家庭关系树 出版社
6.1 树的逻辑结构和基本操作(续)
树的递归定义:
数据结构C语言描述
出版社
6.1 树的逻辑结构和基本操作(续)
数据结构C语言描述
描述图6.1所示的家庭关系树的数据结构: Tree=(D,R),其中: ◆数据元素D={Va Vb Vc Vd Ve Vf Vg Vh Vi Vj Vk Vl Vm } ◆数据关系R={<Va Vb> <Va Vc> <Va Vd> <Vb Ve> <Vb Vf > <Vc Vg> <Vd Vh> <Vd Vi><Vd Vj> <Ve Vk > <Ve Vl > <Vh Vm> }。 树的根为A,根结点无前驱。
出版社
数据结构C语言描述 6.2.1 二叉树的定义及逻辑结构(续)
DeleteChild(bt,p,i)
以bt为根的二叉树已存在,p指向bt中某个结点,1≤i≤d≤2,d为 p所指向结点的度。删除bt中p所指向结点的第i棵子树. leverororderTraversertree(bt) 以bt为根的二叉树已存在,水平遍历二叉树中每个结点一次且 仅一次。 preororderTraversertree(bt)
序的,则称为有序树。图6.1中子树T1、T2…Tn有一
定的相对次序,若交换次序则由这些子树构成另外 一棵树,在这种意义下,称该树是有序的。图6.2(c)、 (d)是不同的两棵树。本章讨论的树均为有序树。
出版社
6.1 树的逻辑结构和基本操作(续)
数据结构C语言描述
森林:m(m≥o)棵互不相交的树的集合。将一棵非 空树的根结点删去,树就变成个森林;反之,给森 林增加一个统一的根结点,森林就变成一棵树。
个结点一次且仅一次。
} ADT binary_tree;
出版社
6.2.2 二叉树的性质
用数学归纳法可以证明(略)
数据结构C语言描述
性质1: 在二叉树中,第i层结点数最多为2i-1个 性质2: 深度为k的二叉树结点总数最多为:2k-1个
证明:∵二叉树中,第i层结点数最多为2i-1个
∴深度为k的二叉树总结点数 =20+21+…+2 k-1 =∑ (i层上结点的最大数) = ∑ 2 i-1=2k-1
第6章 树与二叉树
本章要点:
数据结构C语言描述
树和二叉树的逻辑结构和基本概念。
二叉树的性质和二叉树的存储形式。
二叉树的遍历与线索操作。
树的存储及树与二叉树的转换。
哈夫曼树与哈夫曼编码。
出版社
数据结构C语言描述
线性结构特点是结点间具有唯一前驱和唯 一后继;而非线性结构的特征是:表示结点间 关系的前驱、后继不具有唯一性。
数据元素D:一个集合,该集合中的所有元素具有相同的特性。
出版社
数据结构C语言描述 6.2.1 二叉树的定义及逻辑结构(续)
数据操作: InitTree(bt) 初始化空二叉树,bt为根节点。 CreateTree (bt) 创建一棵二叉树,以bt为根。 DestoryTree(bt) 销毁以bt为根二叉树,释放空间。 TreeEmpty(bt) 判断以bt为根的二叉树是否为空,若空则返回 TRUE,否则返回FALSE。
{D-{A}}存在三个不相交的划分: D1={ Vb Ve Vf Vk Vl } D2={ Vc Vg } D3={ Vd Vh Vi Vj Vm }
出版社
6.1 树的逻辑结构和基本操作(续)
数据结构C语言描述
◆数据结点相应关系{R-{<Va Vb><Va Vc> <Va Vd> }}
存在三个不相交的划分: R1={<Vb Ve> <Vb Vf > <Ve Vk > <Ve Vl> } R2={<Vc Vg>} R3={<Vd Vh> <Vd Vi> <Vd Vj> <Vh Vm> } 且(D1 R1)﹑(D2 R2)﹑(D3 R3)分别组成三棵树,是根 的子树。 显然在这个描述中根是李奶奶,三棵子树(D1 R1)﹑(D2 R2)﹑(D3 R3)所描述的是李奶奶的三个儿子 的家庭关系。
次且仅一次。若Visit()失败,则操作失败。
}ADT Tree
出版社
6.2 二叉树
6.2.1 二叉树的定义及逻辑结构
数据结构C语言描述
二叉树是n(n≥0)个结点的有限集合,每个结点的 度都不大于2。
不难看出:二叉树存在空树,每个结点可以有0、 1或2个孩子。
出版社
数据结构C语言描述 6.2.1 二叉树的定义及逻辑结构(续)
树(tree)T是n(n≥0)个结点的有限集合。 如果n=0是空树;否则满足如下两个条件: 第一有且只有一个称为根(root)的结点,根 结点无前驱;第二除根之外其余n-1个结点 可以划分成m(m>0)个互不相交的有限集 T1,T2,T3,…,Tm ,其中Ti(i=1‥m) 又是一棵树,称为根的子树。显然,这是 递归定义。
出版社
6.1 树的逻辑结构和基本操作(续)
数据结构C语言描述
除此之外,还有其他树的示例:如下图6.2所示。
A A E
A
D G B
A
B
C F
C
C
B
(a)
(b)
(c)
(d)
图6.2
树的示例
出版社
6.1 树的逻辑结构和基本操作(续)
数据结构C语言描述
1、树的有关术语: 结点:包含一个数据元素及描述与其他结点关系的信 息(如前驱、后继指针)。 结点的度:一个结点后继的个数称为该结点的度。图 6.2(b)中A结点的度为3。 树的度:树所有结点的度的最大值。图6.2(b)中各结点 的最大度为3,树的度为3。 叶结点:度为0的结点,是无后继的结点,也称为终 端结点。图6.2(b)中{E,F,C,G}四个结点都是叶结点。 孩子:一个结点的后继称为该结点的孩子。
出版社
6.1 树的逻辑结构和基本操作(续)
数据结构C语言描述
双亲:一个结点的前驱称为该结点的双亲。
结点的层次:从根结点开始层次为l,根节点的后
继结点的层次为2,依此类推。图6.2(b)结点A层次
号为1;B、C、D层次号为2;E、F、G的层次号为3。
兄弟:同一双亲的孩子结点之间互称兄弟。 堂兄弟:同一层上不同双亲的结点称为堂兄弟。 图6.2(b)中F、G互为堂兄弟。 子孙:一个结点的直接后继和间接后继称为该结
以bt为根的二叉树已存在,按先序遍历二叉树中每个结点一次
且仅一次。
出版社
数据结构C语言描述 6.2.1 二叉树的定义及逻辑结构(续)
inorderTraversertree(bt)
以bt为根的二叉树已存在,中序遍历二叉树中每
个结点一次且仅一次。
lenorder Traversertree(bt)
以bt为根的二叉树已存在,后序遍历二叉树中每
单位人员组织机构等都是树结构。
数据结构C语言描述
现实生活中树的例子很多,如家庭成员关系、 例如:某家庭成员关系如下:李奶奶(为描述方便用 A表示)有三个儿子分别用B、C、D表示;大儿子B
有两个孩子,分别用E、F表示;二儿子C有一个孩
子用G表示;三儿子D有三个孩子,分别用H、I、J 表示;李奶奶的孙子E有两个孩子,分别用K、L表 示;另一个孙子H也有一个孩子M。李奶奶的家庭 关系就是树结构 ,我们可以用树的结构来表示。
出版社
数据结构C语言描述 6.2.1 二叉树的定义及逻辑结构(续)
Root(P)
求P结点所在的二叉树根。若二叉树非空,函数返回根,否
则返回“空”。 Depth(bt)
求以bt为根的二叉树深度。如果二叉树非空,函数返回bt深
度,否则返“空”。 Parent(bt, x) 求双亲函数。求以bt为根的二叉树中结点x的双亲结点。若结 点x是二叉树的根或二叉树bt中无结点x, 则返回“空”。
出版社
6.1 树的逻辑结构和基本操作(续)
DeleteChild(T,p,i)
数据结构C语言描述
以T为根的树已经存在,p指向T中某个结点,1≤i≤d,d为p所 指向结 点的度。删除T中p所指向结点的第i棵子树。
TraverseTree(T,Visit())
以T为根的树已经存在,Visit()是对结点进行访问的函数。 按照某种次序对树T的每个结点调用Visit()函数访问一
出版社
6.1 树的逻辑结构和基本操作(续)
FirstChild(T,x)
数据结构C语言描述
以T为根的树已经存,x是T中的某个结点。若x为非叶子结 点,则返回它的第一个孩子结点,否则返回“空”。 NextSibling(T,x)
x是T中的某个结点。若x不是其双亲的最后一个孩子结点,则
返回x后面的下一个兄弟结点,否则返回“空”。 InsertChild(T,p,Child) 以T为根的树已经存在,p指向T中某个结点,非空树Child与T 不相交。将Child插入T中,称为p所指向结点的子树。
基本操作:
InitTree(T)
初始化树一棵树,树根为T。
DestoryTree(T) 销毁以T为根的树,并释放所占内存空间。
出版社
6.1 树的逻辑结构和基本操作(续)
数据结构C语言描述
CreateTree(T) 创建一棵以T为根的树。 TreeEmpty(T) 判断以T为根的树是否为空,如果为空返回TRUE,否则返回 FALSE。 Root(S) 求一棵树的根,S是某树中的一个结点,返回S所在的树的根。 Depth(T) 以T为根的树已经存在,求树T的深度并以函数值返回。 Parent(T,x) 以T为根的树已经存在,x是T中的某个结点。若x为非根结点, 则返回它的双亲,否则返回“空”。
证毕
出版社
6.2.2 二叉树的性质(续)
的结点数为n2,则n0=n2+1。
树是非线性结构,结构中结点间关系是前 驱唯一而后继不唯一,结点之间的数据关系是 一对多的关系。直观地看,树结构是指具有分 支关系的结构。树形结构特别是二叉树应用非 常广泛,在文件系统、编译系统、目录组织等 方面更加突出。在计算机科学和软件工程中研 究它的有着现实意义。 出版社
6.1 树的逻辑结构和基本操作