任务:动态创建一个如图所示的树,并且用三种方式(前、中、后序)输出结果;
一、节点
typedef struct Tree{
int data;
struct Tree * plchild;//左指针域
struct Tree * prchild;//右指针域
}TREE,*PTREE;
二、动态创建树函数
思路:
创建树函数,本质上是递归,返回根节点的地址。
根节的点左树和右树也可以有左树和右树,意味着可以递归使用创建树函数;
如果不需要创建子树,输入一个-1表示不用创建即可;
PTREE creat_tree(void){
int data;
scanf("%d",&data);
PTREE p = (PTREE)malloc(sizeof(TREE));
PTREE prot = p;//第一个根节点的地址另外保存
p->data = data;
if(data == -1){
return NULL;
}else{
printf("请输入%d左子树(输入-1代表不用创建): ",data);
p->plchild = creat_tree();//新创建树,将地址赋值给根节点的左指针域
printf("请输入%d右子树(输入-1代表不用创建): ",data);
p->prchild = creat_tree();//新创建树,将地址赋值给根节点的右指针域
return prot;
}
}
三、前序遍历(中、后序一样的)
前:
思路:递归
1.访问根节点
2.前序遍历根结点左子树
3.前序遍历根节点右子树
void pre_traverse(PTREE p){
if(p==NULL){
return;
}else{
printf("%d",p->data);
if(p->plchild != NULL){
pre_traverse(p->plchild);
}
if(p->prchild != NULL){
pre_traverse(p->prchild);
}
}
}
中:
思路:递归
1.中序遍历根结点左子树
2.访问根节点
3.中序遍历根节点右子树
void in_traverse(PTREE p){
if(p==NULL){
return;
}else{
if(p->plchild != NULL){
in_traverse(p->plchild);
}
printf("%d",p->data);
if(p->prchild != NULL){
in_traverse(p->prchild);
}
}
}
后;
思路:递归
1.后序遍历根结点左子树
2.后序遍历根节点右子树
3.访问根节点
void end_traverse(PTREE p){
if(p==NULL){
return;
}else{
if(p->plchild != NULL){
end_traverse(p->plchild);
}
if(p->prchild != NULL){
end_traverse(p->prchild);
}
printf("%d",p->data);
}
}
四、主函数代码:
#include <stdio.h>
#include <malloc.h>
typedef struct Tree{
int data;
struct Tree * plchild;//左指针域
struct Tree * prchild;//右指针域
}TREE,*PTREE;
PTREE creat_tree(void);
void pre_traverse(PTREE p);
void in_traverse(PTREE p);
void end_traverse(PTREE p);
int main(void){
printf("请输入第一个节点的数据:\n");
PTREE p = creat_tree();
printf("前序输出的结果是:\n");
pre_traverse(p);
printf("\n中序输出的结果是:\n");
in_traverse(p);
printf("\n后序输出的结果是:\n");
end_traverse(p);
return 0;
}
运行结果: