//树的存储结构有四种: 双亲表示法,孩子表示法,孩子兄弟表示法,多重链表表示法
// 双亲表示法
//利用一组连续的存储单元存储树的每个结点,并利用一个指示器表示结点的双亲结点在树中的相对位置
//类似于静态链表的实现。
#define MaxSize 200
typedef char DataType;
typedef struct PNode{
DataType data;
int parent;//指示结点的双亲
}PNode;
typedef struct {
PNode node[MaxSize];
int num;//结点的个数
}PTree;
//孩子表示法
//把每个结点的孩子结点排列起来,看成是一个线性表,且以单链表作为存储结构,则n个结点有n个孩子链表(叶子结点的孩子链表为空表)
//'^'为空
#define MaxSize 200
typedef struct CNode{//孩子结点的类型定义
int child;
struct CNode *next; //指向下一个结点
}ChildNode;
typedef struct{ //n个结点数据与孩子链表的指针构成一个结构
DataType data;
ChildNode * firstchild;
}DataNode;
typedef struct{//孩子表示法类型定义
DataNode node[MaxSize];
int num,root; //结点的个数,根结点在顺序表中的位置
}CTree;
//孩子兄弟表示法
//树的二叉链表表示法,即以二叉链表作为树的存储结构。链表中结点的两个链域分别指向该结点的第一个孩子结点和下一个兄弟结点,
//分别命名firstchild域和nextsibling域
typedef struct CSNode{
DataType data;
struct CSNode*firstchild,*nextsibling;
}CSNode,*CSTree;
//森林转化为二叉树
//1.把森林中的所有树都转换为对应的二叉树
//2.从第二棵树开始,将转换后的二叉树作为前一棵树根结点的右孩子,插入到前一棵树中。
//然后将转换后的二叉树进行对应的旋转
//二叉树转化为森林和树
//1.在二叉树中,将某结点的所有右孩子结点,右孩子的右孩子结点......都与该结点的双亲结点用线条连接。
//2.删除二叉树中的双亲结点与右孩子结点的原来的连线
//3.调整转换后的树或森林,使结点的所有孩子结点处于同一层次。
//树的遍历
//树的遍历分为两种:先根遍历和后根遍历
//先根遍历的步骤:1.访问根结点 2.按照从左到右的顺序依次遍历每一棵子树。
//后根遍历的步骤:1.按照从左到右的顺序依次遍历每一棵子树。2.访问根结点
//森林的遍历
//森林的遍历分为两种:先序遍历和后序遍历
// 先序遍历
//1.访问森林中每一棵树的根结点。
//2.先序遍历第一棵树的根结点的子树。
//3.先序遍历森林中剩余的树。
//后序遍历
//1.中序遍历第一棵树的根结点的子树。
//2.访问森林中第一棵树的根结点。
//3.中序遍历森林中的剩余的树。
树、森林和二叉树 简单介绍
最新推荐文章于 2024-08-07 15:20:04 发布