作业要求
以如下图为例,完成树的遍历:
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);
}