二叉树的建立和遍历的实验报告doc
完整word版二叉树基本操作 实验报告

一、实验目的实验报告 1、 熟悉二叉树树的基本操作。
2、 掌握二叉树的实现以及实际应用。
3、 加深二叉树的理解,逐步培养解决实际问题的编程能力。
二、实验环境 1 台 WINDOWS 环境的 PC 机,装有 Visual C++ 6.0。
三、实验内容【问题描述】现需要编写一套二叉树的操作函数, 以便用户能够方便的利用这些函数来实现自己的应用。
其中操作函数包括: 创建二叉树CreateBTNode(*b,*str):根据二叉树括号表示法的字符串*str 生成对应的链 式存储结构。
输出二叉树 DispBTNode(*b):以括号表示法输出一棵二叉树。
查找结点FindNode(*b,x):在二叉树b 中寻找data 域值为x 的结点,并返回指向该结点 的指针。
求高度BTNodeDepth(*b):求二叉树b 的高度。
若二叉树为空,则其高度为0;否则,其 高度等于左子树与右子树中的最大高度加 求二叉树的结点个数 先序遍历的递归算法: 中序遍历的递归算法: 后序遍历递归算法: 1> 2> 3> 4>5> 6>7> 8>9> NodesCou nt(BTNode *b) void P reOrder(BTNode *b) void In Order(BTNode *b) void P ostOrder(BTNode *b) 层次遍历算法 void LevelOrder(BTNode *b) 【基本要求】实现以上9个函数。
主函数中实现以下功能: 创建下图中的树b 输出二叉树b 找到''节点,输出其左右孩子值 输出b 的高度输出b 的节点个数A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))程序:#in elude <stdio.h>#in elude <malloc.h> #defi ne MaxSize 100 typ edef char ElemT ype;typ edef struct node{ElemT ype data; structnode *lchild; struct node*rchild;} BTNode; /*数据元素*/ /*指向左孩子*/ /*指向右孩子*/void CreateBTNode(BTNode *&b,char *str);// 创建 BTNode *Fi ndNode(BTNode *b,ElemTy pe x);// 查找节点 int BTNodeHeight(BTNode *b);// 求高度void Dis pBTNode(BTNode *b);// 输出int NodesCount(BTNode *b);// 二叉树的结点个数void PreOrder(BTNode *b);// 先序遍历递归void InOrder(BTNode *b);// 中序遍历递归void PostOrder(BTNode *b);// 后序遍历递归void LevelOrder(BTNode *b);// 层次遍历〃创建void CreateBTNode(BTNode *&b,char *str){BTNode *St[MaxSize],* p=NULL;int top=-1,k,j=O;char ch;输出b 的四种遍历顺序 上图转 叉树括号表示法为b=NULL;ch=str[j];while(ch!='\0'){switch(ch){case '(':t op++;St[t op]=p ;k=1;break;case ')':t op--;break;case ',':k=2;break;default: p=(BTNode *)malloc(sizeof(BTNode)); p->data=ch; p->lchild=p-> rchild=NULL; if(b==NULL) b=p;else{switch(k){case 1:St[t op]->lchild=p ;break;case 2:St[t op]->rchild=p ;break;}}} j++;ch=str[j];}}//输出void Dis pBTNode(BTNode *b){if(b!=NULL){prin tf("%c",b->data);if(b->lchild!=NULL||b->rchild!=NULL){prin tf("(");Dis pBTNode(b->lchild); if(b->rchild!=NULL)prin tf(",");Dis pBTNode(b->rchild); prin tf(")");〃查找节点BTNode *Fin dNode(BTNode *b,ElemTy pe x){BTNode *p;if(b==NULL)return b;else if(b->data==x)return b;else{p=Fi ndNode(b->lchild,x);if(p !=NULL)return p;elseretur n Fin dNode(b->rchild,x);//求高度int BTNodeHeight(BTNode *b){ int lchildh,rchildh; if(b==NULL)return (0);else{lchildh=BTNodeHeight(b->lchild); rchildh=BTNodeHeight(b->rchild); return(lchildh>rchildh)?(lchildh+1):(rchildh+1);〃二叉树的结点个数int NodesCou nt(BTNode *b){ if(b==NULL)return 0;elsereturn NodesCou nt(b->lchild)+NodesCou nt(b->rchild)+1;//先序遍历递归void P reOrder(BTNode *b){ if(b!=NULL){prin tf("%c",b->data); PreOrder(b->lchild); PreOrder(b->rchild);〃中序遍历递归void InO rder(BTNode *b){ if(b!=NULL){InO rder(b->lchild); prin tf("%c",b->data); InO rder(b->rchild);}}//后序遍历递归void P ostOrder(BTNode*b){ if(b!=NULL){P ostOrder(b->lchild);P ostOrder(b->rchild); prin tf("%c",b->data);}}//层次遍历void LevelOrder(BTNode *b){BTNode *p;BTNode *qu[MaxSize];int fron t,rear;fron t=rear=-1;rear++;qu[rear]=b;while(fro nt!=rear){fron t=(fro nt+1)%MaxSize;p=qu[fron t];prin tf("%c", p->data);if(p->lchild!=NULL){rear=(rear+1)%MaxSize; qu[rear]=p->lchild;}if(p->rchild!=NULL){ rear=(rear+1)%MaxSize; qu[rear]=p-> rchild; void mai n()BTNode *b,* p, *l p,*rp;char str[]="A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,l)))";// 根据树形图改写成的〃二叉树括号表示法的字符串 *str//char str[100];sca nf("%s",& str);// 自行输入括号表示的二叉树CreateBTNode(b,str); // 创建树 b prin tf("\n");printf (”输出二叉树:");//输出二叉树bDis pBTNode(b);prin tf("\n");printf("'H'结点:");//找到'H'节点,输出其左右孩子值 p=Fi ndNode(b,'H');prin tf("\n");if (p !=NULL){printf("左孩子节点的值");prin tf("%c", p->lchild->data); prin tf("\n");printf("右孩子节点的值");prin tf("%c", p->rchild->data); prin tf("\n");//此处输出p 的左右孩子节点的值}prin tf("\n");printf (” 二叉树 b 的深度:%d\n",BTNodeHeight(b));// 输出 b 的高度 printf (”二叉树b 的结点个数:%d\n",NodesCount(b));//输出b 的节点个数 prin tf("\n");先序遍历序列:\n");//输出b 的四种遍历顺序算法:");PreOrder(b);printf("\n"); 中序遍历序列:\n"); 算法:");InOrder(b);printf("\n"); 后序遍历序列:\n"); 算法:");PostOrder(b);printf("\n"); 层次遍历序列:\n"); 算法:”);LevelOrder(b); printf("\n");printf (”printf (”printf (”printf (”printf (”printf (”printf (”四、实验心得与小结通过实验,我熟悉二叉树树的基本操作,掌握二叉树的实现以及实际应用。
(完整word版)二叉树遍历 实验报告

数据结构实验报告报告题目:二叉树的基本操作学生班级:学生姓名:学号:一.实验目的1、基本要求:深刻理解二叉树性质和各种存储结构的特点及适用范围;掌握用指针类型描述、访问和处理二叉树的运算;熟练掌握二叉树的遍历算法;。
2、较高要求: 在遍历算法的基础上设计二叉树更复杂操作算法;认识哈夫曼树、哈夫曼编码的作用和意义;掌握树与森林的存储与便利。
二. 实验学时:课内实验学时:3学时课外实验学时:6学时三.实验题目1.以二叉链表为存储结构,实现二叉树的创建、遍历(实验类型:验证型)1)问题描述:在主程序中设计一个简单的菜单,分别调用相应的函数功能:1…建立树2…前序遍历树3…中序遍历树4…后序遍历树5…求二叉树的高度6…求二叉树的叶子节点7…非递归中序遍历树0…结束2)实验要求:在程序中定义下述函数,并实现要求的函数功能:CreateBinTree(BinTree &T): 按从键盘输入的前序序列,创建树Preorder(BinTree &T):前序遍历树(递归)Inorder(BinTree &T):中序(递归)遍历树Postorder(BinTree &T): 后序遍历树(递归)PostTreeDepth(BinTree &T):树的高度leaf(BinTree &T):树的叶子节点InorderN(BinTree &T):中序(非递归)遍历树3)数据结构二叉链表存储数据类型定义typedef struct node{TElemType data;struct node *lchild,*rchild;}BinTNode;元素类型:int CreateBinTree(BinTree &T);void Preorder(BinTree &T);void Inorder(BinTree &T);void Postorder(BinTree &T);void InorderN(BinTree &T);int PostTreeDepth(BinTree &T);int leaf(BinTree &T);2、编写算法实现二叉树的非递归中序遍历和求二叉树高度。
二叉树的建立与先序,中序,后序,层次遍历,图的深度优先搜索和广度优先搜索 实验报告

树和图的遍历实验报告2011-4-9实验题目:树和图的遍历实验目的:1.实现二叉树的建立与先序,中序,后序,层次遍历2.选择建立图的类型;根据所选择的类型用邻接矩阵的存储结构构建图;对图进行深度优先搜索和广度优先搜索;实验内容:一、算法描述:(1)二叉树的建立要建立一棵树就要有根节点和两棵子树。
两棵子树的建立同样需要这样的过程。
建立二叉树的过程也是遍历树的过程,实验要求以前序遍历的方式输入数据,因此我们也应按前序遍历的顺序,动态申请存储空间的方式建立这棵树并返回根节点的指针。
BiTNode *CreateBiTree(BiTNode *T){char ch;if((ch=getchar())==' ') T=NULL;else if(ch!='\n'){if(!(T=(BiTNode *)malloc(sizeof(BiTNode))))exit(1);T->data=ch;T->lchild=CreateBiTree(T->lchild);T->rchild=CreateBiTree(T->rchild);}return T;}(2)二叉树的遍历遍历作为二叉树所有操作的基础,因此我把它放在二叉树建立的前面。
前序遍历:即按照根节点,左子树,右子树的顺序访问。
具体操作:遇到节点,立即打印根节点的值,然后访问左子树,再访问右子树。
对左子树和右子树的访问也进行相同的操作。
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);}}//后序遍历二叉树void PostOrderTraverse(BiTree T){if(T){PostOrderTraverse(T->lchild);PostOrderTraverse(T->rchild);putchar(T->data);}}层次遍历:先访问的节点,其孩子节点也必然优先访问,这就用到了队列的思想。
二叉树的建立及其遍历实验报告

数据结构实验报告———二叉树的建立及其遍历一、实验目的1、了解二叉树的建立的方法及其遍历的顺序,熟悉二叉树的三种遍历2、检验输入的数据是否可以构成一颗二叉树二、实验的描述和算法1、实验描述二叉树的建立首先要建立一个二叉链表的结构体,包含根节点和左右子树。
因为耳熟的每一个左右子树又是一颗二叉树,所以可以用递归的方法来建立其左右子树。
二叉树的遍历是一种把二叉树的每一个节点访问完并输出的过程,遍历时根结点与左右孩子的输出顺序构成了不同的遍历方法,这个过程需要按照不同的遍历的方法,先输出根结点还是先输出左右孩子,可以用选择语句实现。
2、算法#include <stdio.h>#include <stdlib.h>#define OVERFLOW 0#define OK 1#define ERROR 0typedef struct BiTNode {char data;struct BiTNode *lchild,*rchild;}BiTNode,*BiTree;BiTree CreateBiTree(BiTree T){scanf("%c",&e);if(e==' ') T=NULL;else {if(!(T=(BiTNode *)malloc(sizeof(BiTNode))))exit(OVERFLOW);T->data=e;T->lchild=CreateBiTree(T->lchild);T->rchild=CreateBiTree(T->rchild);}return T; }/************************前序遍历***********************/ char PreOrderTraverse(BiTree T,char (* Visit)(char e)){if(T){if(Visit(T->data))if(PreOrderTraverse(T->lchild,Visit))if(PreOrderTraverse(T->rchild,Visit)) return OK;return ERROR;}else return OK;}char Visit(char e){printf("%5c",e);return OK;}main(){printf("请输入一颗二叉树,按回车结束:\n");T=CreateBiTree(T);printf("先序遍历的结果:");PreOrderTraverse(T,Visit);}三、调试分析在调这个程序是并没有遇到很大的困难,就是在输入一颗二叉树时,遇到了一点麻烦。
实验四 二叉树运算与遍历实验报告

实验四二叉树运算与遍历实验报告学号-姓名实验时间 2010 年05月24日诚信声明本实验及实验报告所写内容为本人所做,没有抄袭。
实验题目与实验目的题目一:二叉树的遍历运算。
基本要求:在二叉树的二叉链表存储结构基础上,实现二叉树的以下运算:(1)创建二叉树的二叉树链表表示;(2)实现二叉树的先序遍历运算,输出先序遍历运算序列;(3)实现二叉树的中序遍历运算,输出中序遍历运算序列;(4)实现二叉树的后续遍历运算,输出后续遍历运算序列。
实验过程中遇到的主要问题1.根结点忘记申请内存;2.没有添加if(ch=='.')T=NULL;这个作为条件来创造一棵二叉树;3.遍历时没有弄清楚顺序,搞混了先序和中序的顺序。
实验小结1.对结构体的进一步的掌握;2.对递归算法的进一步认识与运用;3.对二叉树的理解由思想到代码实现;4.代码实现思想就是我们应该把问题循环化。
数据结构(自定义数据类型)typedef struct BiTnode{int date;struct BiTnode *lchild, *rchild;}BiTnode,*Bitree; //二叉树链式存储定义主要算法(或算法说明)int createbitree(Bitree &T){char ch;scanf("%c",&ch);if(ch=='.')T=NULL; //条件的判定else{ if(!(T=(Bitree)malloc(sizeof(BiTnode)))) return -1;T->date=ch;createbitree(T->lchild);createbitree(T->rchild);}return 0;} //建立一棵二叉树int preordertraverse(Bitree T){if(T==NULL)return -1;printf("%c",T->date);preordertraverse(T->lchild);preordertraverse(T->rchild);} //先序遍历。
二叉树的遍历(先序遍历、中序遍历、后序遍历全)实验报告

实验目的编写一个程序,实现二叉树的先序遍历,中序遍历,后序遍历。
实验内容编程序并上机调试运行。
编写一个程序,实现二叉树的先序遍历,中序遍历,后序遍历。
编写程序/***********二叉树的遍历**************/#include<stdio.h>#include<stdlib.h>typedef struct BiTNode{char data;struct BiTNode *lchild,*rchild;}BiTNode,*BiTree;/*************************************************///按先序次序构建的二叉树链表void CreatBiTree(BiTree *T){char ch;if((ch=getchar())==' ')*T=NULL;else{*T=(BiTNode*)malloc(sizeof(BiTNode));if(!(*T))exit(1);(*T)->data=ch;CreatBiTree(&(*T)->lchild);CreatBiTree(&(*T)->rchild);}}/*************************************************/ //先序遍历--递归算法void PreOrderTraverse(BiTree T){if(T){printf("%c",T->data);PreOrderTraverse(T->lchild);PreOrderTraverse(T->rchild);}}/*************************************************/ //中序遍历--递归算法void InOrderTraverse(BiTree T){if(T){InOrderTraverse(T->lchild);printf("%c",T->data);InOrderTraverse(T->rchild);}}/*************************************************/ //后序遍历--递归算法void PostOrderTraverse(BiTree T){if(T){PostOrderTraverse(T->lchild);PostOrderTraverse(T->rchild);printf("%c",T->data);}}/*************************************************/ //main函数void main(){BiTree T;printf("请按先序次序输入二叉树中结点的值,空格字符表示空树:\n" );CreatBiTree(&T);printf("\n");printf("先序遍历为:\n");PreOrderTraverse(T);printf("\n\n");printf("中序遍历为:\n");InOrderTraverse(T);printf("\n\n");printf("后序遍历为:\n");PostOrderTraverse(T);printf("\n\n");getchar();}运行程序:结果分析:按先序输入的二叉树为ABC^^DE^G^^F^^^(^为空格)该二叉树画成树形为:其先序遍历为:ABCDEGF其中序遍历为:CBEGDFA其后序遍历为:CGEFDBA可以看出运行结果是正确的。
二叉树的遍历算法实验报告

二叉树实验报告09信管石旭琳 20091004418一、实验目的:1、理解二叉树的遍历算法及应用2、理解哈夫曼树及其应用。
3、掌握哈夫曼编码思想。
二、实验内容:1、建立二叉树二叉链表2、实现二叉树递归遍历算法(中序、前序、后序)3、求二叉树高度4、求二叉树结点个数5、求二叉树叶子个数6、将序号为偶数的值赋给左子树三、主要程序:#include<stdio.h>#include<stdlib.h>typedef int ElemType;struct BiTNode{ElemType data;struct BiTNode *lch,*rch;}BiTNode,*BiTree;struct BiTNode *creat_bt1();struct BiTNode *creat_bt2();void preorder (struct BiTNode *t);void inorder (struct BiTNode *t);void postorder (struct BiTNode *t);void numbt (struct BiTNode *t);int n,n0,n1,n2;void main(){int k;printf("\n\n\n");printf("\n\n 1.建立二叉树方法1(借助一维数组建立)"); printf("\n\n 2.建立二叉树方法2(先序递归遍历建立)"); printf("\n\n 3.先序递归遍历二叉树");printf("\n\n 4.中序递归遍历二叉树");printf("\n\n 5.后序递归遍历二叉树");printf("\n\n 6.计算二叉树结点个数");printf("\n\n 7.结束程序运行");printf("\n==================================="); do{printf("\n请输入你要执行的操作(1,2,3,4,5,6,7)");scanf("%d",&k);printf("\n");switch(k){case 1:{printf("你选择的是操作1,现用方法1进行建立二叉树\n");BiTree=creat_bt1(); /* 调用性质5建立二叉树算法*/break;}case 2:{printf("你选择的是操作2,现用方法2进行建立二叉树\n");BiTree=creat_bt2(); /* 调用递归建立二叉树算法*/break;}case 3:{printf("你选择的是操作3,现进行先序递归遍历二叉树\n结果为:");preorder(BiTree);break;}case 4:{printf("你选择的是操作4,现进行中序递归遍历二叉树\n结果为:");inorder(BiTree);break;}case 5:{printf("你选择的是操作5,现进行后序递归遍历二叉树\n结果为:");postorder(BiTree);break;}case 6:{ n=0,n0=0,n1=0,n2=0; /*全局变量置0 */printf("你选择的是操作6,现进行计算二叉树结点个数\n结果为:");numbt(BiTree);printf("\n 二叉树结点总数是:%d",n);printf("\n 二叉树叶子结点数是:%d",n0);printf("\n 度为1的结点数是:%d",n1);printf("\n 度为2的结点数是:%d",n2);break;}case 7:{printf("你选择的是操作8,将结束本程序运行,谢谢你的使用,再见!\n");break;}}}while(k>=1&&k<7);}struct BiTNode *creat_bt1(){struct BiTNode *v[50],*p,*t;int i,j;ElemType e; /*输入结点的序号i、结点的数据e */printf("\n i,data=");scanf("%d,%d",&i,&e);while(i!=0&&e!=0){p=(struct BiTNode *)malloc(sizeof(struct BiTNode));p->data=e;p->lch=NULL;p->rch=NULL;v[i]=p;if (i==1) /*序号为1的结点是根*/t=p;else{j=(i+1)/2;if(i%2==0) /*序号为偶数,做左孩子*/v[j]->lch=p;elsev[j]->rch=p;}printf("\n i,data=");scanf("%d,%d",&i,&e);}return t;}struct BiTNode *creat_bt2(){struct BiTNode *t;int e;printf("\n data=");scanf("%d",&e);if(e==0) t=NULL; /*对于0值,不分配新结点*/else{t=(struct BiTNode *)malloc(sizeof(struct BiTNode));t->data=e;t->lch=creat_bt2(); /*左孩子获得新指针值*/t->rch=creat_bt2();}return (t);}void preorder (struct BiTNode *t){if(t){printf("%d ",t->data);preorder(t->lch);preorder(t->rch);}}void inorder (struct BiTNode *t){if(t){inorder(t->lch);printf("%d ",t->data);inorder(t->rch);}}void postorder(struct BiTNode *t){if(t){postorder(t->lch);postorder(t->rch);printf("%d ",t->data);}}void numbt(struct BiTNode *t){if(t){numbt(t->lch);{n++;if(t->lch==NULL&&t->rch==NULL)n0++;if((t->lch==NULL&&t->rch!=NULL)||(t->lch!=NULL&&t->rch==NUL L))n1++;if(t->lch!=NULL&&t->rch!=NULL)n2++;}numbt(t->rch);}}四、测试结果:五、小结:实操后还是会搞不清楚数据域及指针域的定义类型的不同。
二叉树的创建与遍历实验完整word版二叉树建立与遍历实验报告范文c语言编写

二叉树的创建与遍历实验完整word版二叉树建立与遍历实验报告范文c语言编写级班年月日姓名学号_1.实验题目建立一棵二叉树,并对其进行遍历(先序、中序、后序),打印输出遍历结果。
2.需求分析本程序用VC编写,实现建立一棵二叉树的功能,并对其进行遍历(先序、中序、后序),并且打印输出遍历结果。
①输入的形式和输入值的范围:输入二叉树的先序,当其结点为空时,需要输入#。
(输入的先序仅含字母和#)②输出的形式:输出二叉树的先序、中序、后序。
③程序所能达到的功能:实现建立一棵二叉树的功能,并对其进行遍历(先序、中序、后序),并且打印输出遍历结果。
④测试数据:输入数据:输入ABC##DE#G##F###输出结果:二叉树的先序遍历为:ABCDEGF二叉树的中序遍历为:CBEGDFA二叉树的后序遍历为:CGEFDBA3.概要设计1)为了实现上述程序功能,需要定义二叉链表的抽象数据类型:typedeftructBinaryTreeNode{TElemTypedata;//二叉树结点中的数据域tructBinaryTreeNode某lchild,某rchild;//二叉树结点的左孩子和右孩子指针}BinaryTreeNode,某BiTree;第1页,共9页基本操作:A.voidCreateBinaryTree(BiTree&T)初始条件:无操作结果:建立了二叉树。
B.voidPreOrder(BiTreeT)初始条件:存在一棵二叉树操作结果:先序遍历二叉树,并且输出先序遍历的结果。
C.voidMidOrder(BiTreeT)初始条件:存在一棵二叉树操作结果:中序遍历二叉树,并且输出中序遍历的结果。
D.voidPotOrder(BiTreeT)初始条件:存在一棵二叉树操作结果:后序遍历二叉树,并且输出后序遍历的结果。
程序包含5个函数:1主函数main()○2先序建立二叉树voidCreateBinaryTree(BiTree&T)○3先序遍历二叉树,并且输出先序遍历的结果voidPreOrder(BiTreeT);○4中序遍历二叉树,并且输出中序遍历的结果voidMidOrder(BiTreeT);○5序遍历二叉树,并且输出后序遍历的结果voidPotOrder(BiTreeT);○各函数间关系如下:main()主函数CreateBinaryTreePreOrderMidOrderPotOrder2第页,共9页4.详细设计1)二叉链表的定义typedeftructBinaryTreeNode{定义一个树结点的数据域;定义一个该结点的左孩子指针和右孩子指针;}先序建立二叉树2)voidCreateBinaryTree(BiTree&T)//{;输入一个字符量NULL;if(输入字符=='#')T指针置值为ele{动态申请一个指向二叉树结构体的指针data;把输入字符赋值给新指针的数据域);成员新指针的lchild调用CreateBinaryTree();rchild成员调用CreateBinaryTree(新指针的}}3)voidPreOrder(BiTreeT)//先序遍历二叉树{{输出T的data域;先序遍历左子树;;先序遍历右子树}}页,共3第9页4)voidMidOrder(BiTreeT)//中序遍历二叉树{if(T指针不为NULL){中序遍历左子树;输出T的data域;;中序遍历右子树}}5)voidPotOrder(BiTreeT)//中序遍历二叉树{;后序遍历左子树;后序遍历右子树;data域T输出的}}.调试分析5,程序运行了一段时间没,&ch)中的%c写成%d%c在编写程序过程中,我将canf(””有结果,经过检查,发现了这个错误。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
二叉树的建立和遍历的实验报告篇一:二叉树的建立及遍历实验报告实验三:二叉树的建立及遍历【实验目的】(1)掌握利用先序序列建立二叉树的二叉链表的过程。
(2)掌握二叉树的先序、中序和后序遍历算法。
【实验内容】1. 编写程序,实现二叉树的建立,并实现先序、中序和后序遍历。
如:输入先序序列abc###de###,则建立如下图所示的二叉树。
并显示其先序序列为:abcde中序序列为:cbaed后序序列为:cbeda【实验步骤】1.打开VC++。
2.建立工程:点File->New,选Project标签,在列表中选Win32 Console Application,再在右边的框里为工程起好名字,选好路径,点OK->finish。
至此工程建立完毕。
3.创建源文件或头文件:点File->New,选File标签,在列表里选C++ Source File。
给文件起好名字,选好路径,点OK。
至此一个源文件就被添加到了你刚创建的工程之中。
4.写好代码5.编译->链接->调试#include#include#define OK 1#define OVERFLOW -2typedef int Status;typedef char TElemType;typedef struct BiTNode{TElemType data;struct BiTNode *lchild, *rchild;}BiTNode,*BiTree;Status CreateBiTree(BiTree &T){TElemType ch;scanf("%c",&ch);if (ch=='#')T= NULL;else{if (!(T = (BiTNode *)malloc(sizeof(BiTNode))))return OVERFLOW;T->data = ch; CreateBiTree(T->lchild); CreateBiTree(T->rchild); }return OK;} // CreateBiTreevoid PreOrder(BiTree T) {if(T){printf("%c",T->data); PreOrder(T->lchild); PreOrder(T->rchild);}}void InOrder(BiTree T) {if(T){InOrder(T->lchild);printf("%c",T->data);InOrder(T->rchild);}}void PostOrder(BiTree T){if(T){PostOrder(T->lchild); PostOrder(T->rchild);printf("%c",T->data);}}void main(){BiTree T;CreateBiTree(T);printf("\n先序遍历序列:"); PreOrder(T);printf("\n中序遍历序列:"); InOrder(T);printf("\n后序遍历序列:"); PostOrder(T);}【实验心得】这次实验主要是通过先序序列建立二叉树,和二叉树的先序、中序、后续遍历算法。
通过这次实验,我巩固了二叉树这部分知识,从中体会理论知识的重要性。
在做实验之前,要充分的理解本次实验的理论依据,这样才能达到事半功倍的效果。
如果在没有真正理解实验原理之盲目的开始实验,只会浪费时间和精力。
例如进行二叉树的遍历的时候,要先理解各种遍历的特点。
先序遍历是先遍历根节点,再依次先序遍历左右子树。
中序遍历是先中序遍历左子树,再访问根节点,最后中序遍历右子树。
而后序遍历则是先依次后续遍历左右子树,再访问根节点。
掌握了这些,在实验中我们就可以融会贯通,举一反三。
所以,这次实验让我懂得了理论知识的重要性,只有领悟了最基本的知识,在实验过程中我们才能够独立的思考,大胆的推断,不断的创新,进而提高动手能力。
篇二:C++二叉树的创建与遍历实验报告二叉树的创建与遍历一、实验目的1.学会实现二叉树结点结构和对二叉树的基本操作。
2.掌握对二叉树每种操作的具体实现,学会利用递归和非递归方法编写对二叉树这种递归数据结构进行处理的算法。
二、实验要求1.认真阅读和掌握和本实验相关的教材内容。
2.编写完整程序完成下面的实验内容并上机运行。
3.整理并上交实验报告。
三、实验内容1.编写程序任意输入二叉树的结点个数和结点值,构造一棵二叉树,采用三种递归和非递归遍历算法(前序、中序、后序)对这棵二叉树进行遍历。
四、实验步骤源程序代码1#include#includeusing namespace std;templatestruct BinTreeNode//二叉树结点类定义{T data; //数据域BinTreeNode *leftChild,*rightChild; //左子女、右子女域BinTreeNode(T x=T(),BinTreeNode* l=NULL,BinTreeNode* r = NULL ):data(x),leftChild(l),rightChild(r){} //可选择参数的默认构造函数 };//------------------------------------------------------------------------- templatevoid PreOrder_2(BinTreeNode *p)//非递归前序遍历{stack * > S;} while(p!=NULL || !S.empty()) {} } p=S.top();S.pop();p = p->rightChild; //遍历指针进到右子女结点 while(p!=NULL) {coutdata; //访问根结点} if(!S.empty()) //栈不空时退栈{ S.push(p); p=p->leftChild;//遍历指针进到左子女结点//---------------------------------------------------------------- templatevoid InOrder_2(BinTreeNode *p)//非递归中序遍历{}stack* > S; do { } while(p !=NULL || !S.empty()); while(p!=NULL) //遍历指针未到最左下的结点,不空 {} if(!S.empty()) //栈不空时退栈 { } p=S.top(); S.pop();coutdata; p=p->rightChild;S.push(p); p=p->leftChild;//------------------------------------------------------------------ templatevoid PostOrder_2(BinTreeNode *p) //非递归后序遍历{}templatevoid InOrder_1(BinTreeNode * subTree){//递归函数:中序次序遍历以subTree为根的子树。
} if(subTree !=NULL)//NULL是递归终止条件 { } coutdata;//访问根结点InOrder_1(subTree->rightChild); //中序遍历根的右子树 InOrder_1(subTree->leftChild); //中序遍历根的左子树 stack * > S; stack tag;//定义一个新的栈用来保存tag域判别根结点的左右子树是否均遍历过 while(p != NULL || !S.empty())//左子树经过结点加L进栈{ } while(p!=NULL) {} while( !S.empty() && tag.top()==1) { } if( !S.empty()) { } else break; tag.pop(); tag.push(1);//遍历右子树前的现场保护,修改栈顶tag为,遍历右子树p=S.top(); // 取栈顶保存的指针p=p->rightChild; p=S.top(); S.pop(); tag.pop(); coutdata; //最后访问根结点。
S.push(p); //首先将t和tag为入栈,遍历左子树p=p->leftChild; tag.push(0);//遍历左子树前的现场保护templatevoid PreOrder_1(BinTreeNode * subTree){//递归函数:前序遍历以subTree为根的二叉树。
}templatevoid PostOrder_1(BinTreeNode * subTree){//递归函数:后序次序遍历以subTree为根的子树。
}//-------------------------------------------------------------------------- templatevoid CreateBinTree(BinTreeNode * & subTree){//递归方式建立二叉树if(item !=-1) {} else subTree = NULL; //封闭指向空子树的指针subTree = new BinTreeNode(); if(subTree == NULL) {} CreateBinTree(subTree->leftChild); //递归建立左子树CreateBinTree(subTree->rightChild); //递归建立右子树cerr>item; } coutdata; //访问根结点if(subTree !=NULL)//NULL是递归终止条件{PostOrder_1(subTree->leftChild); //后序遍历根的左子树 PostOrder_1(subTree->rightChild); //后序遍历根的右子树coutdata;//访问根结点} PreOrder_1(subTree->leftChild); //前序遍历根的左子树PreOrder_1(subTree->rightChild);//前序遍历根的右子树 if(subTree !=NULL)//递归结束条件 { subTree->data = item;}int main(){BinTreeNode * Tree = NULL;cout cout } cout篇三:二叉树的存储与遍历实现实验报告数据结构实验报告学院班级学号姓名实验五二叉树的存储与遍历实现实验报告。