树的定义:
使用递归定义方法。有n个结点(n>=0)的有限集。n=0时成为空树。任一个非空树有且只有一个根节点。n>1时,其余结点可以分为m个互不相交的有限集,其中每个子集又是一个树,称为根的子树。
度的定义
结点的子树个数称为结点的度,树的度是所有结点的度的最大值。
层的定义
根结点开始为第一层,最大层次称为树的深度。
森林
m(m>=0)棵不相交的树的集合
树的存储结构
1.双亲表示法(数组实现)
使用连续的地址空间存储树的结点。每个结点由一个数据域和一个parent域组成。该parent域标识该结点的双亲在数组中的下标。
- #define MAXSIZE 100
- typedef int ElemType;
- typedef struct PTNode{//结点结构
- ElemType data;
- int parent;//指向双亲在数组中的下标
- }PTNode;
- typedef struct PTree{
- PTNode nodes[MAXSIZE];
- int r;//根的位置
- int n;//结点个数
- }PTree
增加长子域
增加右兄弟域
2.孩子表示法(多重链表+数组来实现)
每个结点有多个指针域,每个指针域指向该结点一颗子树的根结点,但问题是树的结点的度并不相同,如何解决。
方法一:指针域个数等于树的度(浪费空间)
方法二:指针域个数等于每个结点自己的度,留有专门位置存储结点指针域的个数(链表结构不相同)
方法三:结点顺序存储在数组中,而每个结点的孩子多少是不确定的,所以使用单链表来体现它们的孩子。
- #define MAXSIZE 100
- typedef struct CTNode{//单链表上的孩子结点
- ElemType data;
- struct CTNode* next;
- }*ChildPtr;
- typedef struct CTBox{//表头结点
- ElemType data;
- ChildPtr firstChild;
- }CTBox;
- typedef struct CTree{//树结构
- CTBox nodes[MAXSIZE];
- int r;
- int n;
- }
也可以加入双亲
3.孩子兄弟表示法
三个域分别是数据域、长子域、右兄弟域,顺利转化为二叉树结构。
- #define MAXSIZE 100
- typedef struct CSNode{
- ElemType data;
- struct CSNode* firstChild;
- struct CSNode* rigthlib;
- }CSNode,*CSTree
转载于:https://blog.51cto.com/fanaticssk/836788