龙空技术网

C语言:数据结构-树的定义(树的基本术语)和逻辑结构

Linux云计算架构 302

前言:

此刻朋友们对“c语言树作用”可能比较注重,咱们都想要剖析一些“c语言树作用”的相关知识。那么小编在网上网罗了一些关于“c语言树作用””的相关文章,希望咱们能喜欢,我们快快来学习一下吧!

树的定义和逻辑结构

(1)树的定义

树是n(n≥0)个结点的有限集T,n=0称为空树,n>0 为非空树。非空树中:

1.有且仅有一个称为根的结点;

2.当n>1时,其余结点可分为m个互不相交的有限集T1、T2、… 、Tm,而每一个Ti(i=1,2,…,m) 也是一棵树。Ti称为根的子树。

(2)树的逻辑结构

1.树中根结点的任意一个直接后继结点及该结点的所有后继结点也是以该结点为根的一棵树;

2.根结点没有前驱结点,其他结点有且仅有一个直接前驱结点;

3.每一个结点可以有零个或多个后继结点;

4.树型结构的元素间存在一对多的关系。

如图6-1所示的一棵树T。

它由根结点A和两棵子树T1和T2所组成,T1和T2分别位于A结点的左下部和右下部,其中树根结点A是两棵子树的根结点B和C的前驱,相反B和C是A的后继;

T1又由它的根结点B和三棵子树T11、T12和T13所组成,这三棵子树分别位于B结点的左下部、中下部和右下部,其中B结点是这三棵子树的根结点D、E和F的前驱,相反它们都是B的后继;T11和T13只含有根结点,不含有子树(或者说子树为空树),不可再分;T12又由它的根结点E和两棵只含有根结点的子树所组成,每棵子树的根结点分别为H和I,E是H和I的前驱,而H和I均是E的后继;T2由它的根结点C和一棵子树所组成,该子树也只含有一个根结点G,不可再分。

树的逻辑结构

树的基本术语

(1)结点的度和树的度

一个结点的子树的数目或者说该结点引出的边数被定义为该结点的度(Degree)。树中所有结点的度的最大值被定义为该树的度。如在图6-1的树中,B结点的度为3,A、E结点的度均为2,C结点的度为1,其余结点的度均为0。因所有结点的最大的度为3,所以树的度为3。

(2)分支结点和叶子结点

在一棵树中,度等于0的结点称作叶子结点或终端结点,度大于0的结点称作分支结点或非终端结点。在分支结点中,每个结点的分支数就是该结点的度数,如对于度为1的结点,其分支数为1,又称为单分支结点;对于度为2的结点,其分支数为2,又称为双分支结点,其余类推。如在图6-1的树中,D、H、I、F、G为叶子结点;A、B、C、E为分支结点,其中C为单分支结点,A和E为双分支结点,B为三分支结点。

(3)孩子结点、双亲结点和兄弟结点

在一棵树中,每个结点的子树的根,或者说每个结点的后继,被习惯地称为孩子、儿子或子女(Child),相应地,把该结点称为孩子结点的双亲、父亲或父母(Parent)。具有同一双亲的孩子互称为兄弟(Brothers)。每个结点的所有子树中的结点被称为该结点的子孙。每个结点的祖先则被定义为从整个树的根结点到达该结点的路径上所经过的全部分支结点。如在图6-1的树中,B结点的孩子为D、E、F结点,双亲为A结点,D、E、F结点互为兄弟,B结点的子孙为D、E、H、I、F结点,I结点的祖先为A、B、E结点。对于图6-1树中的其他结点亦可进行类似的分析。

由孩子结点和双亲结点的定义可知:在一棵树中,根结点没有双亲结点,叶子结点没有孩子结点,其余结点既有双亲结点也有孩子结点。如在图6-1的树中,根结点A没有双亲,叶子结点D、H、I、F、G没有孩子,或者说孩子均为空。

(4)结点的层数和树的深度

树既是一种递归结构,也是一种层次结构,树中的每个结点都处在一定的层次上。结点的层数(Level)从树根开始定义,根结点为第1层,它的孩子结点为第2层,以此类推。树中结点的最大层数被称为树的深度(Depth)或高度(Height)。如在图6-1的树中,A结点处于第1层,B、C结点处于第2层,D、E、F、G结点处于第3层,H、I结点处于第4层。H、I结点所处的第4层为图6-1树中结点的最大层数,所以此树的深度为4。

(5)有序树和无序树

若树中各结点的子树是按照一定的次序从左向右安排的,则称之为有序树,否则称之为无序树。如对于图6-3中的两棵树,若看作无序树,则是相同的;若看作有序树,则不同,因为根结点A的两棵子树的次序不同。又如,对于一棵反映父子关系的家族树,兄弟结点之间是按照排行大小有序的,所以它是一棵有序树。再如,对于一个机关或单位的机构设置树,若各层机构是按照一定的次序排列的,则为一棵有序树,否则为一棵无序树。因为任何无序树都可以当作任一次序的有序树来处理,所以以后若不特别指明,均认为树是有序的。

两棵不同的有序树

(6)森林

森林是m(m≥0)棵互不相交的树的集合。例如,对于树中每个分支结点来说,其子树的集合就是森林。如在图6-1的树中,由A结点的子树所构成的森林为{T1,T2},由B结点的子树所构成的森林为{T11,T12,T13},等等。

树的性质树中的结点数等于所有结点的度数加1

根据树的定义,在一棵树中,除树根结点外,每个结点有且仅有一个前驱结点,也就是说,每个结点与指向它的一个分支一一对应,所以除树根结点之外的结点数等于所有结点的分支数(即度数),从而可得树中的结点数等于所有结点的度数加1。

度为k的树中第i层上至多有k i-1 个结点(i≥1)

对于第一层显然是成立的,因为树中的第一层上只有一个结点,即整个树的根结点,而由i=1代入ki-1计算,也同样得到只有一个结点,即ki-1= k1-1=k0=1;假设对于第i-1层(i>1)命题成立,即度为k的树中第i-1层上至多有k(i-1)-1=ki-2个结点,则根据树的度的定义,度为k的树中每个结点至多有k个孩子,所以第i层上的结点数至多为第i-1层上结点数的k倍,即至多为ki-2*k= ki-1个,这与命题相同,故命题成立。

深度为h的k叉树至多有(k h -1)/(k-1)个结点

显然当深度为h的k叉树(即度为k的树)上每一层都达到最多结点数时,所有结点的总和才能最大,即整个k叉树具有最多结点数。

当一棵k叉树上的结点数等于

时,则称该树为满k叉树。例如,对于一棵深度为4的满二叉树,其结点数为24-1,即15;对于一棵深度为4的满三叉树,其结点数为

,即40。

具有n个结点的k叉树的最小深度为[log k (n(k-1)+1)]

设具有n个结点的k叉树的深度为h,若在该树中前h-1层都是满的,即每一层的结点数都等于ki-1个(1≤i≤h-1),第h层(即最后一层)的结点数可能满,也可能不满,则该树具有最小的深度。根据性质3,此树的结点数n必然小于等于高度为h的满k叉树的结点数,同时必然大于高度为h-1的满k叉树的结点数,则深度h与n之间的关系为:

可变换为 kh-1<n(k-1)+1≤kh

以k为底取对数后得 h-1<logk(n(k-1)+1)≤h

即 logk(n(k-1)+1)≤h<logk(n(k-1)+1)+1

因h只能是整数,所以 h=logk(n(k-1)+1)

因此得到具有n个结点的一般k叉树的最小深度为logk(n(k-1)+1)。

注:x表示对x进行向上取整,其值为大于等于x值的最小整数。如x的值为4和4.3时,向上取整结果分别为4和5。与此相反,x表示对x进行向下取整,其值为小于等于x值的最大整数。如x的值为4.6和5时,向下取整结果分别为4和5。

例如,对于二叉树,求最小深度的计算公式为log2(n+1),若n=20,则最小深度为5;对于三叉树,求最小深度的计算公式为log3(2n+1),若n=20,则最小深度为4。

标签: #c语言树作用 #c语言树的概念