1.树的存储结构
1.双亲表示法
1.双亲表示法即采用一组连续的空间表示,其中根结点的双亲用-1表示。
2.双亲表示法的存储结构
#define MAX_TREE_SIZE 50 //树中最多的结点数
typedef struct{
ElemType data; //数据元素
int parent; //双亲位置
}PTNode;
typedef struct{
PTNode nodes[MAX_TREE_SIZE];
int n; //结点数
}PTree;
这种存储结构可以快速找到双亲的结点,但是在求结点的孩子时,需要遍历整个树形结构。
2.孩子表示法
这种存储方式找子结点比较容易,但是找父节点,则需要遍历N个结点中孩子链表指针域所指向的N个孩子链表。
3.孩子兄弟表示法
以二叉链表作为树的存储结构,每个结点包括3部分内容——结点值、指向结点第一个孩子结点的指针和指向下一个兄弟节点的指针。
这种存储方式很灵活,最大的优势在于可以快速的完成树转化为二叉树的操作,同样,这种结构便于寻找子结点以及兄弟结点,查找双亲结点的时候比较麻烦,若每个结点在增设一个parent域指向其父节点,则查找父结点也很方便。
4.树、森林、二叉树的转换
树转换二叉树的规则:每个结点左指针指向它的第一个孩子结点,右指针指向它在树中相邻的兄弟结点,可表示为“左孩子,右兄弟”,由于根结点没有兄弟,所以树转换而得的二叉树没有右子树。
树->二叉树(之前有问题,现已修正)
将森林转化为二叉树的规则与树类似,先将森林中的每一棵树都转化为二叉树,再将第一棵树的根作为转换后的二叉树的根,第一棵树的左子树作为转换后二叉树根的左子树,第二棵树作为转换后二叉树的右子树,第三棵树作为转换后二叉树根的右子树的右子树。以此类推,就可以将森林转化为二叉树
二叉树->森林
二、树和森林的遍历
一、树的遍历:
1.先根遍历:相对应为树的先序遍历
2.后根遍历:相对应为树的中序遍历
二、森林的遍历
1.先序遍历森林
1)访问森林中第一棵树的根结点
2)先序遍历第一棵树中的根节点的子树森林
3)先序遍历除第一课子树之后剩余的树构成森林。
2.中序遍历森林
1)中序遍历森林中第一棵树的根结点的子树森林
2)访问第一棵树的根结点
3)中序遍历除去第一棵树之后剩余的树构成的森林