数据结构实验报告递归和非递归遍历二叉树.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;iprintf("");
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;iprintf("");
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");
}
五实验中遇到的问题及解决方法:
(注:
如有则写,无则可省)