当前位置:文档之家› 数据结构实验报告

数据结构实验报告

数据结构实验报告第次实验学号: 20141060106 姓名:叶佳伟一、实验目的1、复习二叉树的逻辑结构、存储结构及基本操作;2、掌握二叉链表及二叉树的创建、遍历;3、了解二叉树的应用。

二、实验内容1、(必做题)假设二叉树中数据元素类型是字符型,请采用二叉链表实现二叉树的以下基本操作:(1)根据二叉树的先序序列和中序序列构造二叉树;(2)根据先序遍历二叉树;(3)根据中序遍历二叉树;(4)根据后序遍历二叉树。

测试数据包括如下错误数据:先序:1234;中序:12345先序:1234;中序:1245先序:1234;中序:42312、(必做题)对于一棵二叉树,请实现:(1)计算二叉树的叶子数目;(2)计算二叉树的深度。

三、算法描述(采用自然语言描述)1、先构造一个二叉树的结构体,再构造createtree的函数实现数据的输入。

在键盘上输入先序和中序序列。

先判断先序和后序序列是否符合逻辑。

若符合逻辑,则在先序、中序、后序函数将二叉树输出。

四、详细设计(画出程序流程图)五、程序代码(给出必要注释)#define max 5#define TEL 2*max+1#include "stdio.h"#include "stdlib.h"#include "string.h"typedef char TElemType;typedef struct BiTNode{TElemType data; //数据域struct BiTNode *lchild, *rchild; //左右孩子指针域} BiTNode, *BiTree;BiTNode root;BiTree rt=&root;int calculate(char c,char s[],int st){char *p;p=s+st;while(*p!=c && *p!='\0') p++;return p-s;}void createtree(BiTree *t,int i1,int i2,int len,char preorder[],char pinorder[]) {int r,llen,rlen;if(len<=0) *t=NULL;else{*t=(BiTree)malloc(sizeof(BiTNode));(*t)->data=preorder[i1];r=calculate(preorder[i1],pinorder,i2);llen=r-i2;rlen=len-(llen+1);createtree(&(*t)->lchild,i1+1,i2,llen,preorder,pinorder);createtree(&(*t)->rchild,i1+llen+1,r+1,rlen,preorder,pinorder);}}void PostOrderTraverse(BiTree t){if(t){PostOrderTraverse(t->lchild);PostOrderTraverse(t->rchild);putchar(t->data);}}void PreOrderTraverse(BiTree t){if(t){putchar(t->data);PreOrderTraverse(t->lchild);PreOrderTraverse(t->rchild);}}void InOrderTraverse(BiTree t){if(t){InOrderTraverse(t->lchild);putchar(t->data);InOrderTraverse(t->rchild);}}main(){ char preorder[max],pinorder[max];printf("请输入二叉树的先序:");gets(preorder);printf("请输入二叉树的中序:");gets(pinorder);if(strlen(pinorder)!=strlen(preorder))printf("对不起!输入的数据有问题\n");else {createtree(&rt,0,0,max,preorder,pinorder);printf("先序遍历二叉树为:");PreOrderTraverse(rt);printf("\n");printf("中序遍历二叉树为:");InOrderTraverse(rt);printf("\n");printf("后序遍历二叉树为:");PostOrderTraverse(rt);printf("\n");}}2. #include <stdio.h>#include <malloc.h>#define MaxSize 50#include<iostream>using namespace std;#define N 100typedef struct node{ char data;struct node *lchild,*rchild;}BTNode;BTNode *createbintree(){BTNode *t;char x;scanf("%c",&x);if (x=='#') t=NULL;else{t=(BTNode *)malloc(sizeof(BTNode)); t->data=x;t->lchild=createbintree();t->rchild=createbintree();}return(t);}void preorder(BTNode *t){if(t!=NULL){printf("%c ",t->data);preorder(t->lchild);preorder(t->rchild);}}void inorder(BTNode *t){if(t!=NULL){inorder(t->lchild);printf("%c ",t->data);inorder(t->rchild);}}void postorder(BTNode *t){if(t!=NULL){postorder(t->lchild);postorder(t->rchild);printf("%c ",t->data);}}void inorder1(BTNode *t){int i=0;BTNode *a[N],*p;if(t==NULL) return;p=t;do{while(p){a[i++]=p;p=p->lchild;}if(i!=0){p=a[--i];printf("%c ",p->data); p=p->rchild;}}while(i!=0 || p);}void TravLevel(BTNode *t){BTNode *Qu[MaxSize];int front,rear;front=rear=0;if (t!=NULL)printf("%c ",t->data);rear++;Qu[rear]=t;while (rear!=front){front=(front+1)%MaxSize;t=Qu[front];if (t->lchild!=NULL){printf("%c ",t->lchild->data); rear=(rear+1)%MaxSize;Qu[rear]=t->lchild;}if (t->rchild!=NULL){printf("%c ",t->rchild->data); rear=(rear+1)%MaxSize;Qu[rear]=t->rchild;}}printf("\n");}int height(BTNode *t){int u=0;int v=0;if (t==NULL)return 0;else{u=height(t->lchild);v=height(t->rchild);if (u>v)return u+1;elsereturn v+1;}}void select(BTNode *t){int m,n;printf("\n请选择\n1. 先序遍历\n2. 中序遍历1\n3. 中序遍历2\n4. 后序遍历\n5. 层次遍历\n6.求树的深度\n7.求树叶数\n"); scanf("%d",&m);switch(m){case 1:preorder(t);break;case 2:inorder(t);break;case 3:inorder1(t);break;case 4:postorder(t);break;case 5:TravLevel(t);break;case 6:cout<<"树的深度为"<<height(t)<<endl;break; default:printf("请重新选择\n");select(t); }printf("\n\n1.继续\n2. 退出\n"); scanf("%d",&n);switch(n){case 2:break;case 1:default:select(t);}}void main(){BTNode *t;printf("请建立树空格用“#”字号代替");printf("\n请输入完整的树:");t=createbintree();select(t);}六、测试和结果2.(给出测试用例以及测试结果)七、用户手册(告诉用户如何使用程序)使用Microsoft Visual C++。

相关主题