树的定义:

    使用递归定义方法。有n个结点(n>=0)的有限集。n=0时成为空树。任一个非空树有且只有一个根节点。n>1时,其余结点可以分为m个互不相交的有限集,其中每个子集又是一个树,称为根的子树。

度的定义

    结点的子树个数称为结点的度,树的度是所有结点的度的最大值。

层的定义

    根结点开始为第一层,最大层次称为树的深度。

森林

    m(m>=0)棵不相交的树的集合

树的存储结构

1.双亲表示法(数组实现)

    使用连续的地址空间存储树的结点。每个结点由一个数据域和一个parent域组成。该parent域标识该结点的双亲在数组中的下标。

    

 

 
  
  1. #define MAXSIZE 100 
  2. typedef int ElemType; 
  3. typedef struct PTNode{//结点结构  
  4.     ElemType data; 
  5.     int parent;//指向双亲在数组中的下标  
  6. }PTNode; 
  7. typedef struct PTree{ 
  8.     PTNode nodes[MAXSIZE]; 
  9.     int r;//根的位置  
  10.     int n;//结点个数  
  11. }PTree 

 

增加长子域

 

增加右兄弟域

 

 

2.孩子表示法(多重链表+数组来实现)

    每个结点有多个指针域,每个指针域指向该结点一颗子树的根结点,但问题是树的结点的度并不相同,如何解决。

    方法一:指针域个数等于树的度(浪费空间)

    方法二:指针域个数等于每个结点自己的度,留有专门位置存储结点指针域的个数(链表结构不相同)

    方法三:结点顺序存储在数组中,而每个结点的孩子多少是不确定的,所以使用单链表来体现它们的孩子。

    

 
  
  1. #define MAXSIZE 100 
  2. typedef struct CTNode{//单链表上的孩子结点  
  3.     ElemType data; 
  4.     struct CTNode* next; 
  5. }*ChildPtr; 
  6. typedef struct CTBox{//表头结点  
  7.     ElemType data; 
  8.     ChildPtr firstChild; 
  9. }CTBox; 
  10. typedef struct CTree{//树结构  
  11.     CTBox nodes[MAXSIZE]; 
  12.     int r; 
  13.     int n; 
  14. }  

也可以加入双亲

   

3.孩子兄弟表示法

三个域分别是数据域、长子域、右兄弟域,顺利转化为二叉树结构。

 

 
  
  1. #define MAXSIZE 100 
  2. typedef struct CSNode{ 
  3.     ElemType data; 
  4.     struct CSNode* firstChild; 
  5.     struct CSNode* rigthlib; 
  6. }CSNode,*CSTree