数据结构实验报告递归和非递归遍历二叉树.docx
- 文档编号:7416569
- 上传时间:2023-01-23
- 格式:DOCX
- 页数:9
- 大小:17.17KB
数据结构实验报告递归和非递归遍历二叉树.docx
《数据结构实验报告递归和非递归遍历二叉树.docx》由会员分享,可在线阅读,更多相关《数据结构实验报告递归和非递归遍历二叉树.docx(9页珍藏版)》请在冰豆网上搜索。
数据结构实验报告递归和非递归遍历二叉树
实验报告
课程名称:
数据结构实验名称:
递归和非递归遍历二叉树任课教师:
专业:
计网类班级:
2007级1班学号:
姓名:
完成日期:
2008年12月10日
一、实验目的:
掌握二叉树的如下内容:
二叉树的二叉链表存储方式、结点结构和类型定义;二叉树上的建立、遍历运算及应用。
二、主要实验内容及要求:
使用VC++语言编写程序:
(1)实现二叉树的二叉链表存储方式和数据类型。
(2)编写程序实现二叉树上的建立和遍历算法,编译运行程序。
(3)编写程序实现基于二叉树的一个应用实例,编译运行程序。
(试编写算法,求二叉树上叶子结点的数量,分别采用递归和非递归的方式。
二叉树用二叉链表存贮。
)
三、程序说明:
(算法设计思路)
第1个程序:
首先构造二叉树链表的存储结构,然后定义CreateTree(BiTree&T)函数用于创建二叉树,并按先序次序输入二叉树结点的值,如果想停止输入某节点的值,则输入#。
通过Visit(BiTreep)函数来访问节点值。
通过outputTree(BiTreepbnode,inttotalSpace)输出二叉树结构图。
通过main()函数来调用这些方法。
第2个程序:
首先构造二叉树链表的存储结构和栈的顺序存储表示,然后定义CreateTree(BiTree&T)函数用于创建二叉树,并按先序次序输入二叉树结点的值,如果想停止输入某节点的值,则输入#。
再定义下列函数:
StackEmpty(SqStack&S)(判断S是否是空栈)、Push(SqStack&S,BiTreep)(将P压入栈S)、Pop(SqStack&S,BiTree&p)(退栈)、CountLeaf(BiTree&T,intCount)(先序递推遍历二叉树的递推算法求叶子节点数)、InOrderTraverAndCountLeaf(BiTree&T)(非递推遍历二叉树求叶子节点数)先按先序顺序从根节点开始将节点压入栈,若为空节点则不压入栈,P退栈,输出其节点值,如此循环,一直到遍历完为止,在此期间,如果遇到某节点左右孩子均为空,则计为一个叶子节点数。
通过outputTree()输出二叉树结构图。
以上方法通过main()实现。
具体步骤看源程序代码。
四、实验结果与结论:
(经调试正确的源程序和程序的运行结果)
1:
实现二叉树上的建立和遍历算法
编程员:
lghgxu
程序源代码:
#include"stdio.h"
#include"stdlib.h"
#defineOVERFLOW-2
#defineSTACK_INIT_SIZE100
#defineSTACKINCREMENT10
typedefstructBiTNode//二叉树链表的存储结构
{chardata;
structBiTNode*lchild,*rchild;//左右孩子指针
}BiTNode,*BiTree;
//创建二叉树,并按先序次序输入二叉树结点的值。
voidCreateTree(BiTree&T)
{charch;
scanf("%c",&ch);
if(ch=='#')
T=NULL;
else
{if(!
(T=(BiTNode*)malloc(sizeof(BiTNode))))
exit(OVERFLOW);//存储分配失败
T->data=ch;
printf("请输入%c的左子树,否则输入#\n",T->data);
CreateTree(T->lchild);
printf("请输入%c的右子树,否则输入#\n",T->data);
CreateTree(T->rchild);
}//else
}//CreateTree
//访问二叉树节点
Visit(BiTreep)
{if(p)
{printf("%c",p->data);
returntrue;
}//if
else
returnfalse;
}//Visit
//先序遍历二叉树的递推算法
PreOrderTraverse(BiTree&T)
{if(T)
{if(Visit(T))
if(PreOrderTraverse(T->lchild))
if(PreOrderTraverse(T->rchild))
returntrue;
returnfalse;
}//if
else
returntrue;
}
voidoutputTree(BiTreepbnode,inttotalSpace)/*输出二叉树*/
{if(pbnode!
=NULL)
{totalSpace+=8;/*右子树与根节点相距8个空格*/
outputTree(pbnode->rchild,totalSpace);
for(inti=0;i printf(""); printf("%c\n\n",pbnode->data); outputTree(pbnode->lchild,totalSpace);/*递归调用左子树*/ } } voidmain()//主函数 {BiTreet; inttotalSpace=0; printf("如果创建一棵树,请输入根节点数据,否则输入#\n"); CreateTree(t); printf("二叉树的结构图如下: \n"); printf("左边第一个节点是二叉树的根节点\n\n"); printf("其上方是右子树,下方是左子树\n\n"); outputTree(t,totalSpace); printf("先序遍历二叉树的结果如下: \n"); PreOrderTraverse(t); printf("\n恭喜你,遍历成功! : \n"); } 2: 应用实例递推和非递推法求二叉树叶子结点数 编程员: lghgxu 程序源代码: #include"stdio.h" #include"stdlib.h" #defineOVERFLOW-2 #defineSTACK_INIT_SIZE100 #defineSTACKINCREMENT10 //二叉树链表的存储结构 typedefstructBiTNode {chardata; structBiTNode*lchild,*rchild;//左右孩子指针 }BiTNode,*BiTree; //栈的顺序存储表示 typedefstruct {BiTNode*base;//栈底指针 BiTNode*top;//栈顶指针 intstacksize;//当前已分配的存储空间 }SqStack; //建立一个空栈 voidInitStack(SqStack&S) {S.base=(BiTree)malloc(STACK_INIT_SIZE*sizeof(BiTNode)); if(! S.base) exit(OVERFLOW);//存储分配失败 S.top=S.base; S.stacksize=STACK_INIT_SIZE; }//InitStack //压入栈 voidPush(SqStack&S,BiTreep) {if(S.top-S.base>=S.stacksize)//满栈,追加存储结构 {S.base=(BiTree)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(BiTNode)); if(! S.base)exit(OVERFLOW);//存储分配失败 S.top=S.base+S.stacksize; S.stacksize+=STACKINCREMENT; }//if *(++S.top)=*p; }//Push //退出栈 Pop(SqStack&S,BiTree&p) {if(S.top==S.base) {printf("空栈\n"); returnfalse; } p=(BiTree)malloc(sizeof(BiTNode)); *p=*S.top; --S.top; returntrue; }//Pop //判断是否是空栈 StackEmpty(SqStack&S) {if(S.top==S.base) returntrue; else returnfalse; } //创建二叉树 voidCreateTree(BiTree&T) {charch; scanf("%s",&ch); if(ch=='#') T=NULL; else {if(! (T=(BiTNode*)malloc(sizeof(BiTNode)))) exit(OVERFLOW);//存储分配失败 T->data=ch; printf("请输入%c的左子树,否则输入#\n",T->data); CreateTree(T->lchild); printf("请输入%c的右子树,否则输入#\n",T->data); CreateTree(T->rchild); }//else }//CreateTree //访问二叉树节点字符 Visit(BiTreep) {if(p) {printf("%c",p->data); returntrue; } else returnfalse; }//Visit //先序递推遍历二叉树的递推算法求叶子节点数 intCountLeaf(BiTree&T,intCount) {intcount=Count;//Count记录叶子节点数 if(! T)returncount; else {count=CountLeaf(T->lchild,count); count=CountLeaf(T->rchild,count); if(! (T->lchild)&&! (T->rchild)) return(++count); returncount; }//if } //非递推遍历二叉树 intInOrderTraverAndCountLeaf(BiTree&T) {intj=0,count=0; BiTreep; p=(BiTNode*)malloc(sizeof(BiTNode));//关键一步 p=T; SqStacks; InitStack(s); while(p||! StackEmpty(s)) {if(p) {Push(s,p);//如果p为非空,将p压入栈 if(! (p->lchild)&&! (p->rchild)) ++count;//记录叶子节点数 p=p->lchild; }//if else { Pop(s,p);//如果p为空,则p退栈 Visit(p); p=p->rchild; }//else }//while returncount; }//InOrderTraver voidoutputTree(BiTreepbnode,inttotalSpace)/*输出二叉树*/ {if(pbnode! =NULL) {totalSpace+=8;/*右子树与根节点相距8个空格*/ outputTree(pbnode->rchild,totalSpace); for(inti=0;i printf(""); printf("%c\n\n",pbnode->data); outputTree(pbnode->lchild,totalSpace);/*递归调用左子树*/ } } //主函数 voidmain() {BiTreet; inttotalSpace=0,count1=0,count2=0; printf("如果创建一棵树,请输入根节点数据,否则输入#\n"); CreateTree(t); printf("二叉树的结构图如下: \n"); printf("左边第一个节点是二叉树的根节点\n\n"); printf("其上方是右子树,下方是左子树\n\n"); outputTree(t,totalSpace); count1=CountLeaf(t,count1); printf("递推法遍历叉树所得叶子节点数为: %d\n\n",count1); printf("中序遍历二叉树结果如下: \n\n"); count2=InOrderTraverAndCountLeaf(t);//非递推遍历二叉树 printf("\n非递推法遍历二叉树所得叶子节点数: %d\n\n",count2); printf("\n恭喜你,你成功! \n"); } 五实验中遇到的问题及解决方法: (注: 如有则写,无则可省)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 实验 报告 递归 遍历 二叉