双亲表示法
(顺序存储)
//查指定结点的双亲方便,指定结点的孩子则需要从头遍历
//根节点固定存储在0,且-1表示没有双亲
#define MAX_TREE_SIZE 100
typedef struct{ //树的节点定义
ElemType data;
int parent; //双亲位置域
}PTNode;
typedef struct{ //树的类型定义
PTNode nodes[MAX_TREE_SIZE]; //双亲表示
int n; //节点数
}PTree;
孩子表示法
(顺序+链式存储)
struct CTNode{
int child; //孩子结点在数组中的位置
struct CTNode *next; //下一个孩子
};
typedef struct{
ElemType data;
struct CTNode *firstchild; //第一个孩子
}CTBox;
typedef struct{
CTBox nodes[MAX_TREE_SIZE];
int n,r; //结点树和根的位置
}CTree;
孩子兄弟表示法
(链式存储)
typedef struct CSNode{
ElemType data;
struct CSNode *firstchild,*nextsibling; //第一个孩子和右兄弟指针,孩子为左指针,兄弟为右指针
}CSNode,*CSTree;
森林和二叉树的转换
森林是m(m>=0)棵互不相交的树的集合
将各个树的根节点视为兄弟关系
本质上是用二叉链表存储森林