1.实验目的
1、理解树的结构特征及各种储存方法
2、掌握前序序列递归建树算法
3、掌握树的前序、后序及层次遍历,设计并实现树结构相关问题算法
2.实验内容
1、造树及前中后序遍历
2、层次遍历输出
3、凹入表示
4、括号表示
3.设计思路
首先进行树的创建,建树首先要造根,若为空树,返回NULL,非空树则先造结点,然后给结点所以域赋值。层次遍历的算法思想是1、根入队;2、while(队不空){2.1、p=出队元素2.2、打印p;2.3、p的所有非空孩子入队;},最后再实现凹入和括号表示算法。
4.关键代码
#include<stdio.h>
#include<stdlib.h>
# define m 3
# define MAX 20
typedef struct k{
char data;
struct k* c[m];
}tree;
typedef struct{
tree* a[MAX];
int f,r;
}Queue;
void initQueue(Queue *q){
q->f=0; q->r=0;
}
int isEmpty(Queue *q){
if(q->f==q->r) return 1;
else return 0;
}
void enQueue(Queue *q, tree *x){
q->a[ q->r ]=x;
q->r=(q->r+1)%MAX;
}
tree* outQueue(Queue *q){
tree *x;
x=q->a[ q->f ];
q->f=(q->f+1)%MAX;
return x;
}
//建树=造根==》根分成两种情况1、空树 --- return NULL;2、非空树
//非空树= 造结点 + 给结点的所有域赋值
tree *create(){ int i;
tree *t; char c=getchar();
if(c=='#')return NULL; //输入'#',表示空
//走至此处,表明是要创建非空树
//非空树= 造结点 + 给结点的所有域赋值
t=malloc(sizeof(tree));
t->data=c;
for(i=0; i<m; i++)
t->c[i]=create();//create()表示创建一棵树,
//t->c[i]=create();表示将新建的树交给t的孩子t->c[i]
return t;
}
void pre(tree *t){ int i;
if(t==NULL)return;
printf("%c ",t->data);
for(i=0; i<m; i++)
pre(t->c[i]);
}
void post(tree *t){ int i;
if(t==NULL)return;
for(i=0; i<m; i++)
post(t->c[i]);
printf("%c ",t->data);
}
void level(tree *t){
/* 层次遍历算法
1、根入队;
2、while(队不空){
2.1、p=出队元素;
2.2、打印p;
2.3、p的所有非空孩子入队;
}
*/
int i; tree *p;
Queue *q=malloc(sizeof(Queue));
initQueue(q); enQueue(q,t);
while( isEmpty(q)==0 ){
p=outQueue(q);
printf("%c ",p->data);
for(i=0; i<m; i++)
if(p->c[i]!=NULL)
enQueue(q,p->c[i]);
}
}
void aoruOut(tree * t, int kg, int jh){
int i;//kg:空格数,jh:#数
if (t==NULL) return;
/*下面四行输出根*/
for(i=1; i<=kg; i++) printf(" ");
printf("%c ",t->data);
for(i=1; i<=jh; i++) printf("##");
printf("\n");
for(i=0; i<m; i++)//输出所有孩子
aoruOut(t->c[i], kg+2, jh-2);
}
void kuohao(tree *t){int i;
if (t==NULL) return;
printf( "%c ", t->data );
printf("( ");
for(i=0; i<m; i++){
kuohao(t->c[i]);
printf(",");
}
printf(")");
}
main(){
tree *t;
printf("请输入建树数据,#表示NULL:");
t=create();
printf("\n pre: ");pre(t);
printf("\npost: ");post(t);
printf("\nlevel: ");level(t);
printf("\naoru: \n");aoruOut(t,2,10);
printf("\nkuohao: ");kuohao(t);
}
5.运行结果
6.实验总结(含心得体会)
通过这次实验,我理解了树的结构特征及各种储存方法,掌握了前序序列递归建树算法,掌握了树的前序、后序及层次遍历,设计并实现树结构相关问题算法。本次实验让我明白了要多做,多锻炼,才可以使自己的编程能力得到提高。