1、第6章树和二叉树第6章 树与二叉树 前几章讨论的线性表、堆栈、队列等都是线性结构。本章讨论非线性结构,树与二叉树(也称树形结构)就是一种典型的非线性结构。树形结构中每个结点只允许有一个直接前驱结点,但允许有一个以上直接后继结点。树形结构除用于表示结点间的相邻关系外,还可以表示层次关系。本章主要讨论树和二叉树的定义、存储结构和基本运算算法的实现等。6.1 树的基本概念6.1.1 树的定义 1. 形式化定义树(Tree):T=K,R。K是包含n个结点的有穷集合(n0),关系R满足以下条件:(1)有且仅有一个结点k0K,它对于关系R来说没有前驱结点,结点k0称作树的根。 (2)除结点k0外,K中的每
2、个结点对于关系R来说都有且仅有一个前驱结点。 (3)K中每个结点对于关系R来说可以有多个后继结点。 2. 递归定义树(Tree)是由n(n0)个结点组成的有限集合(记为T)。其中,如果n=0, 即T为空时,称为空树,这是树的特例; 如果n0,这n个结点中有且仅有一个特定的称为根(Root)的结点(根结点没有前驱结点),其余结点可分为m (m0)个互不相交的有限集T1,T2,Tm,其中每个子集本身又是一棵符合本定义的树,称为根Root的子树(Subtree)。这是一个递归的定义,即在定义中又用到了树这个术语。它道出了树的固有特性。仅有一个根结点的树是最小树,树中结点较多时,每个结点都是某一棵子树
3、的根。图6.1是一棵由9个结点组成的树T。其中A是根结点,其余结点分为三个互不相交的子集:T1=B,H,I,T2=C,T3=D,E,F,G。T1、T2、T3都是树根A的子树,这三棵子树的根结点分别是B、C、D。每棵子树本身也是一棵树,可继续划分。例如子树T3以D为根结点,它的其余结点又可分为两个互不相交的子集:T31=E,T32=F,G,而其中T31可以认为是仅有一个根结点的子树。 在一棵树中,一个结点被定义为其子树的根结点的双亲结点,而其子树的根结点就是它的孩子结点。如在图6.1中,A为B、C、D的双亲结点,B、C、D则为A的孩子结点;而B又为H和I的双亲结点。 从定义可以看出, 树结构具有
4、以下特点: 有且仅有根结点没有双亲结点; 除根结点外,其余所有结点有且仅有一个双亲结点; 包括根结点在内,每个结点可以有多个孩子结点。即,树的数据元素之间存在着一对多的关系。 图6.1 树T 树型结构是一类重要的非线性结构。树型结构是结点之间有分支,并且具有层次关系的结构,它非常类似于自然界中的树。例如家谱、行政组织机构都可用树形象地表示。树在计算机领域中也有着广泛的应用,例如在编译程序中,用树来表示源程序的语法结构;在数据库系统中,可用树来组织信息;在分析算法的行为时,可用树来描述其执行过程。等等。6.1.2 树的逻辑表示 树的逻辑表示方法很多,但无论采用哪种表示方法,都应该能够正确表达出树
5、中数据元素之间的层次关系。下面是几种常见的逻辑表示方法。1. 树形表示法如图6.1所示,树形结构被形象地表示为一棵倒置的、树根在上、树叶在下的树。树的每个结点都用一个圆圈表示,圆圈内的符号代表该结点中的数据,结点之间的关系通过连线表示。连线上方的结点为连线下方的结点的双亲结点,而连线下方的结点则为连线上方结点的孩子结点。这种表示方法形象、直观,大多数书中都采用这种方法。 2. 文氏图表示法文氏图表示法也称集合图表示法,其中每一个圆形对应着一棵树,圆内包含根结点和子树。图6.1所示的树, 其文氏图表示法如图6.2(a)所示。 3. 凹入表示法 凹入表示法中的每个条形对应着一个树根,子树的树根对应
6、的条形较短,并在其直接前驱对应的条形之下,图6.1所示的树若采用凹入表示法,则如图6.2(b)所示。 4. 嵌套括号表示法 嵌套括号表示法也称为广义表表示法,每棵树的根可作为由子树构成的表的名字,放在表的左边,如图6.2(c)所示。 A(B(H,I),C,D(E,F(G)(c) 嵌套括号表示法 图 6.2 树的逻辑表示方法6.1.3 树的基本术语1. 结点的度和树的度每个结点具有的子树数或者说后继结点数被定义为该结点的度(degree)。所有结点的度的最大值被定义为该树的度。如在图6.1的树T中,B、D结点的度为2,A结点的度为3, F结点的度为1,其余结点的度均为0。因结点中度最大的为3,
7、所以树T的度为3。 2. 分支结点和叶结点 度大于0的结点称作分支结点或非终端结点;度等于0的结点称作叶结点或终端结点。在分支结点中,又把度为1的结点叫做单分支结点, 度为2的结点叫做双分支结点,以此类推。如在图6.1的树T中,A、 B、 D、 F都是分支结点, C、E、H、I、G都是叶结点。在分支结点中, F为单分支结点, B、D分别为双分支结点,A为三分支结点。 3. 路径与路径长度对于任意两个结点ki和kj,若树中存在一个结点序列ki,ki1,ki2,kin,kj,使得序列中除ki外的任一结点都是其在序列中的前一个结点的后继,则称该结点序列为由ki到kj的一条路径,用路径所通过的结点序列
8、(ki,ki1,ki2,kj)表示这条路径。路径的长度等于路径所通过的结点数目减1(即路径上分支数目)。可见,路径就是从ki出发“自上而下”到达kj所通过的树中结点序列。显然,从树的根结点到树中其余结点均存在一条路径。4. 孩子结点、 双亲结点和兄弟结点 每个结点的子树的根,或者说每个结点的后继,被习惯地称作该结点的孩子(child),相应地,该结点被称作孩子结点的双亲。 具有同一双亲的孩子互称兄弟(sibiling)。 每个结点的所有子树中的结点被称作该结点的子孙。每个结点的祖先被定义为从树根结点到达该结点的路径上经过的所有结点。如在图6.1的树T中, D结点的孩子为E、F结点,双亲为A结点
9、;E、F互为兄弟; D结点的子孙为E、F、G结点。G结点的祖先为A、D结点。对于树T中的其他结点亦可进行同样的分析。由孩子结点和双亲结点的定义及树结构的特点可知:在一棵树中,根结点没有双亲结点, 叶结点没有儿子结点。如在图6.1的树T中,A结点没有双亲结点, C、E、H、I等结点没有孩子结点。 5. 结点的层数和树的高度 树既是一种递归结构,也是一种层次结构。 树中的每个结点都处在一定的层次上。结点的层数(level)从树根开始定义, 根结点的层次规定为1,它的孩子结点为第2层,以此类推。一个结点所在的层次为其双亲结点所在的层次加1。树中结点的最大层数称为树的深度(depth)或高度(heig
10、ht)。如在图6.1的树T中, A结点处于第1层,B、 C、 D结点处于第2层, H、I、E、F结点处于第3层, G结点处于第4层。G结点所处的第4层为树T中结点的最大层数, 所以树T的高度为4。 6. 有序树和无序树 若树中各结点的子树是按照一定的次序从左向右安排的, 则称之为有序树,否则称之为无序树。如图6.3中的两棵树, 若看作无序树,则是相同的;但若看作有序树,则不同。 因为根结点A的两棵子树的次序不同。又如,对于一棵反映双亲孩子关系的家族树,若兄弟结点之间是按照排行大小有序的, 则它是一棵有序树。 图 7.3 两棵不同的有序树 7. 森林 森林是m(m0)棵互不相交的树的集合。例如,
11、对于树中每个分支结点来说, 其子树的集合就是森林。森林:n(n0)个互不相交的树的集合称为森林。森林的概念与树的概念十分相近,因为只要把树的根结点删去就成了森林。反之,只要给n棵独立的树加上一个结点,并把这n棵树作为该结点的子树,则森林就变成了树。如图6.1的树T中, 由A结点的子树所构成的森林为T1, T2, T3,由D结点的子树所构成的森林为T31, T32。 6.2 二 叉 树 6.2.1 二叉树的定义 二叉树(Binary Tree)是n(n0)个结点的有限集合。它或为空树(n=0),或为非空树;对于非空树有:(1)有一个特定的称之为根的结点;(2)根结点以外的其余结点分别由两棵互不相
12、交的称之为左子树和右子树的二叉树组成。这个递归定义表明二叉树或为空,或是由一个根结点加上两棵分别称为左子树和右子树的互不相交的二叉树组成的。由于左、右子树也是二叉树,则由二叉树的定义,它们也可以为空。由此,二叉树可以有五种基本形态,如图6.4所示。 从以上分析得知二叉树与普通树比较,有以下特点: 二叉树可以为空树。 二叉树的度不大于2(即每个结点至多只有两棵子树)。 二叉树是有序树,其左子树和右子树是严格区分且不能随意颠倒的。如图6.4(c)和图6.4(d)就是二棵不同的二叉树。 下面介绍两种特殊形态的二叉树:满二叉树和完全二叉树。满二叉树:深度为k且含有2k-1个结点的二叉树为满二叉树,这种
13、树的特点是每层上的结点数都是最大结点数,如图6.5(a)所示。对满二叉树的结点可以从根结点开始自上向下,自左至右顺序编号,图6.5(a)中每个结点边的数字即是该结点的编号。图6.4 二叉树的五种基本形态(a) 空二叉树; (b) 只有一个根结点; (c) 有根结点和左子树;(d) 有根结点和右子树; (e) 有根结点和左、右子树完全二叉树:深度为k,含有n个结点的二叉树,当且仅当每个结点的编号与相应满二叉树结点顺序号从1到n相对应时,则称此二叉树为完全二叉树,如图6.5(b)所示。而图6.5(c)则不是完全二叉树。 完全二叉树的特点是: 所有的叶结点都出现在第k层或k-1层。 对任一结点,如果
14、其右子树的最大层次为i,则其左子树的最大层次为i或i+1。图6.5 满二叉树和完全二叉树(a) 满二叉树;(b) 完全二叉树;(c) 非完全二叉树6.2.2 二叉树的性质二叉树具有下列重要性质:性质1: 在二叉树的第i层上至多有2i-1个结点(i=1)。采用归纳法证明此性质。 当i=1时,只有一个根结点,2i-1=20 =1,命题成立。 现在假定多所有的j,1=j=1)。由性质1可知,各层结点最多数目之和为20+21+22+2k-1;由于:20+21+22+2k-1=2k-1,因此二叉树中结点的最大数目为2k-1。性质3: 对任何一棵二叉树,如果其终端结点数为n0,度为2的结点数为n2,则n0
15、=n2+1。设二叉树中度为1的结点数为n1,二叉树中总结点数为N,因为二叉树中所有结点均小于或等于2,所以有:N=n0+n1+n2 (1)再看二叉树中的分支数,除根结点外,其余结点都有一个进入分支,设B为二叉树中的分支总数,则有:N=B+1。由于这些分支都是由度为1和2的结点射出的,所以有: B=n1+2*n2 则有: N=B+1=n1+2n2+1 (2)由式(1)和(2)得到: n0+n1+n2=n1+2*n2+1 n0=n2+1性质4:具有n个结点的完全二叉树的深度为log2n +1(其中x表示不大于x的最大整数)。 假设此二叉树的深度为k,则根据性质2及完全二叉树的定义得到:2k-1-1n=2k-1 即 2k-1=n2k取对数得到:k-1=log2nk 因为k是整数。所以有:k=log2n +1。性质5: 如果对一棵有n个结点的完全二叉树的结点按层序编
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1