欢迎使用CSDN-markdown编辑器

来源:互联网 发布:云端是什么软件 编辑:程序博客网 时间:2024/06/13 00:51
 树形结构是一类非常重要的非线性数据结构。其中以树和二叉树最为常用,直观看来,树是以**分支关系**定义的层次结构。 ***树的基本定义和基本术语*** 树是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)    }}
0 0