您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 二叉树各种基本运算与遍历算法
数据结构与算法实验报告实验名称:二叉树各种基本运算与遍历算法班级:10软工转本1姓名:季佳宾学号:10130605类型:综合实验地点:鹤琴404日期:2012.11.15一、实验目的:1.理解二叉树的概念及其基本运算算法(这些算法包括二叉树的创建、节点访问、求二叉树的深度以及二叉树的先根遍历、中根遍历、后根遍历算法)2.用c语言实现二叉树的基本运算算法和遍历算法。3.调试程序,编译运行并用数据测试程序4.熟悉c语言编程二、实验环境:1.PC机一台(带有VS6.0软件)三、实验内容和要求:1、用c语言实现二叉树的基本运算算法(包括二叉树的创建、节点访问、求二叉树的深度);2、用c语言实现二叉树的三种遍历算法(先根遍历、中根遍历、后根遍历),其中中根遍历算法用递归和非递归两种方式实现,加深理解栈在非递归实现中的应用;3、调试程序,编译运行并用数据测试程序四、实验步骤:(对实验步骤的说明应该能够保证根据该说明即可重复完整的实验内容,得到正确结果。)1、对实现二叉树的基本运算算法以及遍历算法做分析,绘制算法流程图1)设计二叉树的节点表示方法2)设计和实现相关算法函数2、在VS6.0环境下编译实现代码1)编辑源程序,达到调试编译运行的目的2)利用数据进行测试验证五、实验结果与分析(含程序、数据记录及分析和实验总结等):实验7.1实现二叉树各种基本运算的算法,代码如下所示:#includestdio.h#includemalloc.h#defineMaxSize100typedefcharElemType;typedefstructnode{ElemTypedata;structnode*lchild;structnode*rchild;}BTNode;voidCreateBTNode(BTNode*&b,char*str){BTNode*St[MaxSize],*p=NULL;inttop=-1,k,j=0;charch;b=NULL;ch=str[j];while(ch!='\0'){switch(ch){case'(':top++;St[top]=p;k=1;break;case')':top--;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){case1:St[top]-lchild=p;break;case2:St[top]-rchild=p;break;}}}j++;ch=str[j];}}BTNode*FindNode(BTNode*b,ElemTypex){BTNode*p;if(b==NULL)returnNULL;elseif(b-data==x)returnb;else{p=FindNode(b-lchild,x);if(p!=NULL)returnp;elsereturnFindNode(b-rchild,x);}}BTNode*LchildNode(BTNode*p){returnp-lchild;}BTNode*RchildNode(BTNode*p){returnp-rchild;}intBTNodeDepth(BTNode*b){intlchilddep,rchilddep;if(b==NULL)return(0);else{lchilddep=BTNodeDepth(b-lchild);rchilddep=BTNodeDepth(b-rchild);return(lchilddeprchilddep)?(lchilddep+1):(rchilddep+1);}}voidDispBTNode(BTNode*b){if(b!=NULL){printf(%c,b-data);if(b-lchild!=NULL||b-rchild!=NULL){printf(();DispBTNode(b-lchild);if(b-rchild!=NULL)printf(,);DispBTNode(b-rchild);printf());}}}intBTWidth(BTNode*b){struct{intlno;BTNode*p;}Qu[MaxSize];intfront,rear;intlnum,max,i,n;front=rear=0;if(b!=NULL){rear++;Qu[rear].p=b;Qu[rear].lno=1;while(rear!=front){front++;b=Qu[front].p;lnum=Qu[front].lno;if(b-lchild!=NULL){rear++;Qu[rear].p=b-lchild;Qu[rear].lno=lnum+1;}if(b-rchild!=NULL){rear++;Qu[rear].p=b-rchild;Qu[rear].lno=lnum+1;}}max=0;lnum=1;i=1;while(i=rear){n=0;while(i=rear&&Qu[i].lno==lnum){n++;i++;}lnum=Qu[i].lno;if(nmax)max=n;}returnmax;}elsereturn0;}intNodes(BTNode*b){intnum1,num2;if(b==NULL)return0;elseif(b-lchild==NULL&&b-rchild==NULL)return1;else{num1=Nodes(b-lchild);num2=Nodes(b-rchild);return(num1+num2+1);}}intLeafNodes(BTNode*b){intnum1,num2;if(b==NULL)return0;elseif(b-lchild==NULL&&b-rchild==NULL)return1;else{num1=LeafNodes(b-lchild);num2=LeafNodes(b-rchild);return(num1+num2);}}voidmain(){BTNode*b,*p,*lp,*rp;CreateBTNode(b,A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I))));printf(\n);printf((1)输出二叉树:);DispBTNode(b);printf(\n);printf((2)'H'结点:);p=FindNode(b,'H');if(p!=NULL){lp=LchildNode(p);if(lp!=NULL)printf(左孩子为%c,lp-data);elseprintf(无左孩子);rp=RchildNode(p);if(rp!=NULL)printf(右孩子为%c,rp-data);elseprintf(无右孩子);}printf(\n);printf((3)二叉树b的深度:%d\n,BTNodeDepth(b));printf((4)二叉树b的宽度:%d\n,BTWidth(b));printf((5)二叉树b的结点个数:%d\n,Nodes(b));printf((6)二叉树b的叶子结点个数:%d\n,LeafNodes(b));printf(\n);}实验结果:实验7.2实现二叉树各种遍历算法,代码如下所示:#includestdio.h#includemalloc.h#defineMaxSize100typedefcharElemType;typedefstructnode{ElemTypedata;structnode*lchild;structnode*rchild;}BTNode;voidCreateBTNode(BTNode*&b,char*str){BTNode*St[MaxSize],*p=NULL;inttop=-1,k,j=0;charch;b=NULL;ch=str[j];while(ch!='\0'){switch(ch){case'(':top++;St[top]=p;k=1;break;case')':top--;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){case1:St[top]-lchild=p;break;case2:St[top]-rchild=p;break;}}}j++;ch=str[j];}}voidDispBTNode(BTNode*b){if(b!=NULL){printf(%c,b-data);if(b-lchild!=NULL||b-rchild!=NULL){printf(();DispBTNode(b-lchild);if(b-rchild!=NULL)printf(,);DispBTNode(b-rchild);printf());}}}voidPreOrder(BTNode*b){if(b!=NULL){printf(%c,b-data);PreOrder(b-lchild);PreOrder(b-rchild);}}voidPreOrder1(BTNode*b){BTNode*p;struct{BTNode*pt;inttag;}St[MaxSize];inttop=-1;top++;St[top].pt=b;St[top].tag=1;while(top-1){if(St[top].tag==1){p=St[top].pt;top--;if(p!=NULL){top++;St[top].pt=p-rchild;St[top].tag=1;top++;St[top].pt=p-lchild;St[top].tag=1;top++;St[top].pt=p;St[top].tag=0;}}if(St[top].tag==0){printf(%c,St[top].pt-data);top--;}}}voidPreOrder2(BTNode*b){BTNode*St[MaxSize],*p;inttop=-1;if(b!=NULL){top++;St[top]=b;while(top-1){p=St[top];top--;printf(%c,p-data);if(p-rchild!=NULL){top++;St[top]=p-rchild;}if(p-lchild!=NULL){top++;St[top]=p-lchild;}}printf(\n);}}voidInOrder(BTNode*b){if(b!=NULL){InOrder(b-lchild);printf(%c,b-data);InOrder(b-rchild);}}voidInOrder1(BTNode*b){BTNode*p;struct{BTNode*pt;inttag;}St[MaxSize];inttop=-1;top++;St[top].pt=b;St[top].tag=1;while(top-1){if(St[top].tag==1){p=St[top].pt;top--;if(p!=NULL){top++;St[top].pt=p-rchild;St[top].tag=1;top++;St[top].pt=p;St[top].tag=0;top++;St[top].pt=p-lchild;St[top].tag=1;}}if(St[top].tag==0){printf(%c,St[top].pt-data);top--;}}}voidInOrder2(BTN
本文标题:二叉树各种基本运算与遍历算法
链接地址:https://www.777doc.com/doc-2736407 .html