Fork me on GitHub

c语言数据结构学习心得——树

一对多的树型结构,有且只有一个特定的根结点。

结点的度:结点拥有子树的数量{

                                       度为0:叶子结点/终端结点。

                                       度不为0:非终端结点/分支结点(除去根结点其它称为内部结点)。}

树的度:树中所有结点的度数的最大值。

树的层次:根为第一层,以此类推。

结点的深度:根结点开始,自顶向下累加。

结点的高度:叶结点开始,自底向上累加。

树的高度(深度):树中结点的最大层数。

 

结点关系:

祖先结点:根结点到该点的唯一路径上的任意结点。

子孙结点

双亲结点:根结点到该点的唯一路径上的最近结点。

孩子结点

兄弟结点:有相同双亲结点的结点。

 

树中的数学关系:

1.树中的结点数等于所有结点的度数加1。

2.度为m的树中第i层上最多有mi-1个结点。

3.高度为h的m叉树至多有(mn-1)/(m-1)个结点。

4.具有n个结点的m叉树的最小高度为[logm(n(m-1)+1)]

 

树的存储结构

顺序存储结构

双亲表示法:用一组连续的存储空间存储树的结点,同时在每个结点中,用一个变量存储该结点双亲结点在数组中的位置。typedef char ElemType;

typedef struct TNode{
     ElemType data;           //结点数据
     int parent;              //该结点双亲在数组的下标
}TNode;                       //结点数据类型

#define MaxSize 100
typedef struct{
TNode nodes[MaxSize]; //结点数组
int n; //结点数量
}Tree; //树的双亲表示结构

 

链式存储结构

孩子表示法:把每个结点的孩子结点排列起来存储成1个单链表,所以n个结点有n个链表;

                      叶子结点链表为空;

                      n个单链表的头指针又存储在一个顺序表(数组)中。

孩子链表结点代码:

typedef char ElemType;
typedef struct CNode{
   int child;         //该孩子在表头的数组下标
   struct CNode *next;//指向该结点的下一个孩子结点
}CNode,*child         //孩子结点数据类型

每个孩子链表的表头结点(存在数组中):

typedef struct{
    ElemType data;    //结点数据域
    child first child;//指向该结点的第一个孩子结点
}TNode;               //孩子结点的数据类型
#define MaxSize 100
typedef struct{
     TNode nodes[MaxSize];//结点数据域
     int n;               //树中结点数量
}Tree;                    //树的孩子表示结构

孩子兄弟表示法:存储孩子结点和兄弟结点。

typedef char ElemType;
typedef struct CSNode{
   ElemType data;                   //该结点数据域
   struct CSNode *firsrchild,*right;//指向该结点的第一个孩子结点和该结点的右兄弟结点
}CSNode                             //孩子兄弟结点数据类型

 

posted @ 2019-03-26 18:29  一个阳  阅读(1247)  评论(0编辑  收藏  举报