作业要求
以如下图为例,完成树的遍历:
1、利用孩子兄弟表示法的存储结构
2、利用先根序列创建树
3、先根遍历树
4、后根遍历树
思考
预期的结果应该为:
1、先根创建树时需要输入的数据为:
A B E 0 F 0 0 C 0 D G 0 0 0 0
2、先根遍历的输出结果为:
A B E F C D G
3、后根遍历的输出结果为:
E F B C G D A
代码实现
#include <stdio.h>
#include <malloc.h>
// 创建结构体
struct TreeNode{
char data;
struct TreeNode *firstchild;
struct TreeNode *nextsibling;
};
//先根创建孩子兄弟链表
void CreatTree(struct TreeNode **T) {
char ch;
scanf("\n %c", &ch);
if (ch == '0') {
*T = NULL;
}
else {
*T = (struct TreeNode *) malloc(sizeof(struct TreeNode));
(*T)->data = ch;
CreatTree(&((*T)->firstchild)); // 创建第一个孩子结点
CreatTree(&((*T)->nextsibling)); // 创建右兄弟结点
}
}
//先根遍历
void RootFirst(struct TreeNode *T){
struct TreeNode *p;
if(T!=NULL){
printf("%3c",T->data); //打印根结点
p = T->firstchild; //指向根的第一个孩子结点
while (p){
RootFirst(p);
p = p->nextsibling; //指向下一个孩子结点,即当前结点的右兄弟结点
}
}
}
// 后根遍历
void RootLast(struct TreeNode *T){
if (T != NULL) {
struct TreeNode* Fchild = T->firstchild; //获取第一棵子树
while (Fchild != NULL) { //依次访问每一棵子树
RootLast(Fchild); //后序访问子树
Fchild = Fchild->nextsibling; //访问另一棵子树
}
printf("%3c", T->data); //访问根节点
}
}
int main(){
struct TreeNode *t;
printf("***************先根创建树***************\n");
printf("请输入结点树的数据:");
CreatTree(&t);
printf("***************先根遍历树***************\n");
printf("先根遍历结点结果:");
RootFirst(t);
printf("\n***************后根遍历树***************\n");
printf("后根遍历结点结果:");
RootLast(t);
}