假期连载之十

(树形结构—树的基本概念及抽象数据类型)

 

    树形结构的亮点在于其应用广泛。尽管本节仅介绍概念以及理论上的内容,但无论如何都不能忽视对实际应用的渗入,否则将失去其本身研究的意义。

 

    树的基本概念

 

    在计算机科学中,树作为组织信息的重要形式之一,代表了非线性数据结构的一般特征。这里有两种基本的树,一种被称为自由树free tree

    自由树指定义一个二元组Tf=(V,E),其中V={v1,v2,…,vn}是由n个结点构成的优先集合(n>=0),称为顶点集合vertexvi称为顶点,其中1<=i<=nE={(vi,vj)|vi,vj属于V,且i>=1,j<=n}是由n-1个元素组成的序对集合,称为边集合。E中的元素(vi,vj)为边edge的分支branchE使得Tf成为一个连通图。综上可知,自由树的概念类似于图,且对其讨论的范围仅限于图论部分的内容,本文不作涉及。

    另一种树称为有根树rooted tree。一棵有根树T,简称为树,它是由n>=0个结点的有限集合。当n=0时,T称为空树,否则T是非空树,记作:

       Φ,          n=0

T={r,T1,…,Tn},n>0

其中rT的一个特殊结点,称为根rootT1,…,Tn是除r之外其它结点构成的互不相交的m>=0个子集合。每个子集合也是一棵树,称为根的子树subtree

每棵子树的根结点有且仅有一个直接前驱,但可以有0个或多个直接后继,m称为r的分支数。

 

    在计算机系统和其它领域中,树的表示方法不尽相同。基本上有以下几种方法:

1、  倒置树结构,即最常用的树形表示方法。

2、  文氏图表示法,使用嵌套集合的形式。

3、  广义表形式,即嵌套括号的表示方法。

4、  凹入表示法,用位置的缩进表示其层次,如目录表的编排格式。

 

树的一些基本术语

 

结点node,包含一个数据元素及若干指向其它结点的分支信息。

结点的度degree,是一个结点所拥有的子树的棵数。

叶结点leaf,指度为0的结点,也称为终端结点。

分支结点branch,除叶结点以外的其它结点,也称为非终端结点。

结点层次level,从根结点开始,根结点层次为1,根结点的直接后继层次为2,依次类推。

结点的层序编号No.of node,是指按从上层到下层,同层从左至右的顺序对结点以自然数编号。

树的度degree,树中所有结点度的最大值。

树的高度height,树中所有结点层次的最大值。

有序树ordered tree,在树T中,若各子树Ti之间是有先后次序的,称为有序树。

森林forest,指m>=0棵不相交的树的集合。

同构isomorphism,对于两棵树,通过对结点适当地重命名,就可以使两棵树完全相等,则称这两棵树同构。

为了描述结点之间层次关系,我们还借助人类家族术语进行定义:

子女结点child,一个结点的直接后继称为这个结点的child

父结点parent,一个结点的直接前驱称为这个结点的parent

兄弟结点sibling,同一双亲结点的子女结点之间互称为sibling

祖先结点ancestor,一个结点的祖先结点是指从根结点到该结点路径上的所有结点。

子孙结点descendant,一个结点的直接后继和间接后继称为该结点的子孙结点。

另外,按照结点序号的大小,结点又可以前辈、后辈表示,父结点为兄弟结点的子女结点之间互称为堂兄弟结点。

 

树的抽象数据类型

 

ADT Tree

{

数据对象D:一个集合,该集合中的所有元素具有相同特性

    数据关系R:见树的定义

    基本操作:

    InitTree(Tree);             //初始化Tree为空树

    DestoryTree(Tree);          //销毁树

    CreateTree(Tree);           //创建树Tree

    TreeEmpty(Tree);            //Tree为空,返回TRUE,否则返回FALSE

    Root(Tree);                 //返回树Tree的根

    Parent(Tree,x);             //Tree存在,xTree中的某个结点,若x为非根结点,则返回其父结点,否则返回空

    FirstChild(Tree,x);         //Tree存在,xTree中的某个结点,若x为非叶结点,则返回其第一个孩子结点,否则返回空

    NextSibling(Tree,x);        //Tree存在,xTree中的某个结点,若x为不是父结点的最后一个子女结点,则返回其下一个兄弟结点,否则返回空

    InsertChild(Tree,p,Child);  //Tree存在,p指向Tree中的某个结点,非空树ChildTree不相交,将Child插入Tree中,其中p是该子树的根结点

DeleteChild(Tree,p,i);      //Tree存在,p指向Tree中的某个结点1<=i<=ddp所指向结点的度,删除Treep所指向结点的第i棵子树

TraverseTree(Tree,Visit()); //Tree存在,Visit()是对结点进行访问的函数,按照某种次序对Tree的每个结点调用Visit()函数最多访问一次,若Visit()失败,则操作失败

}

鉴于树结构重要性,我们将本块内容分成多个连载分别进行讨论,方便读者进行整理。

 

(未完待续)