树形结构是一类非常重要的非线性数据结构。其中以树和二叉树最为常用,直观看来,树是以**分支关系**定义的层次结构。
***树的基本定义和基本术语***
树是n(n>=0)个结点的有限集合。在任意一颗非空树中:
1.有且仅有一个特定的称为根(Root)的结点
2.当n>1时,其余结点可分为m(m>0)个互不相交的有限集,又称为子树(SubTree)
这里要注意几个概念:
节点的度和树的度
前者是指:树中某个节点的子树的个数称为该节点的度
后者是指:树中各节点的度最大值称为树的度
分支节点和叶节点
分支节点的意思就是度不为0的节点
度为1的节点称为单分支节点
度为2的节点称为双分支节点
叶节点的意思就是度为0的节点
路径与路径长度
路径如何表示
路径长度=路径所通过的节点-1
孩子、父母、兄弟、祖先
节点的层次和树的高度
森林 :n个互不相交的树的集合
把树的根节点delete就成森林,反之就成树
了解相关的一些概念后,接下来就是树的性质
性质1:树中的节点树等于所有节点的度数加1
证明
(树的定义)在一颗树中,除Root外,每个节点有且仅有一个前驱节点
(理解)每个节点与指向它的一个分支一一对应
(推导)除Root的节点树=所有节点的分支数
(节点度的定义)节点的SubTree的个数为该节点的度
(结论)树中的节点树=所有节点的度数+1
以上这个步骤可以好好利用,很多性质都是以类似的来推导的
树的存储结构
双亲存储结构
一组顺序存储结构,用一组连续空间存储树的所有节点
同时在每个节点中附设一个伪指针的指示其双亲节点的位置
typedef struct{
ElemType data;
int parent;
}PTree[Maxsize];
孩子链存储结构
存储每个节点的值,以及所有孩子的链接
按照树的度(即树中所有节点度的最大值)设计节点的孩子节点指针域个数
typedef struct node{
ElemType data;
struct node *sons[MaxSons];
}TSonNode;
孩子兄弟链的结构(常用)
孩子兄弟链存储结构是为每个节点设计三个域
一个数据元素
一个该节点的第一个孩子节点的指针域
一个该节点的下一个兄弟节点指针域
typedef struct tnode{
ElemType data; //节点的值
struct tnode *hp; //指向兄弟
struct tnode *vp; //指向孩子节点
}TSBNode;
用孩子-兄弟链作为存储结构,求树的高度?
int TreeHeight(TSNode *t)
{
TSNode *p;
int m,max=0;
if(t==NULL)
return 0;
else if(t->vp==NULL)
return 1;
else{
//求t 的子树的高度m
p=t->vp;
while(p!=NULL)
{
m=TreeHeight(p);
if(max<m)
max=m;
p=p->hp;
}
return(max+1)
}
}