数据结构实验报告(六)

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.实验总结(含心得体会)

通过这次实验,我理解了树的结构特征及各种储存方法,掌握了前序序列递归建树算法,掌握了树的前序、后序及层次遍历,设计并实现树结构相关问题算法。本次实验让我明白了要多做,多锻炼,才可以使自己的编程能力得到提高。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值