6.1树的基本概念
树型结构是区别于线性结构的另一大数据结构,它具有分支性
和层次性
。
树是由n(n>=0)个结点构成的有限集合。n=0的树称为空树;当n!=0时,树中的结点度应该满足下列条件:
- 有且仅有一个特定的结点称之为根
- 其余结点分成m(m>=0)个互不相交的有限集合,T1,T2,…,Tm,其中每一个集合又都是一颗树,称T1,T2,…,TM为根结点的子树。
- 以上是一个递归定义。
树的度
:我们将一结点拥有的子女数称为该结点的度,树中所有结点度的最大值称为树的度。
叶子结点
:称度为0的结点为终端结点或者叶子结点。
分支结点
:称度不为0的结点为非终端结点或分支结点。
树枝
:树中连接两个结点的线段称为树枝
路径
:在树中,若从结点Ki开始沿着树枝自上而下能到达结点kj,则称ki到kj存在一条路径。路径的长度等于所经过的树枝数。
树中结点的层次
:从树根开始定义,根节点为第1层,根的子女结点构成第2层,以此类推。若某结点kj位于第i层,则其子女就位于第i+1层。
树的深度或高度
:称树中结点的最大层次数为树的深度或高度。
有序树
:若树中任意结点的子树均看成是从左到右有次序的,不能随意交换,则称该树是有序树;否则称为无序树。
森林
:由m(m>=0)颗互不相交的树构成的集合称为森林。森林和树的概念十分相近,一颗树中每个结点的子树所构成的几个即为一个森林,而在森林中的每棵树之上加一个共同的根,森林就成为了一棵树。
6.3树的存储结构
常用的树的存储结构有三种:双亲表示法、孩子表示法、孩子兄弟表示法
6.3.1双亲表示法
在树中,除根节点没有双亲外,其他每个结点的双亲是唯一确定的。故存储树中的结点应该包含两个信息:结点的值data和体现结点之间的相互关系的属性-----该结点的双亲parent。
可以将树中所有的结点存放在一个一维数组中。
#define MAXSIZE 100
typedef char datatype;
typedef struct node
{
datatype data;
int parent;
}node;
typedef struct tree
{
node treelist[MAXSIZE];
int length ,root;
}tree;
6.3.2孩子表示法
采用孩子表示法表示一棵树时,树中每个结点除了存储自身的值之外,还必须指出其所有子女的位置。 每个结点通常包含两个域:一个是元素的值域data,另一个为指针数组。数组中的每个元素均为一个指向该结点子女的指针;一颗m度的数,其指针数组的大小即为m。
孩子表示法又分为三种:
- 指针方式的孩子表示法
- 数组方式的孩子表示法
- 链表方式的孩子表示法
1、指针方式的孩子表示法
#define m 3
typedef char datatype;
typedef struct node{
datatype data;
struct node *child[m];