数据结构实验报告递归和非递归遍历二叉树.docx

上传人:b****5 文档编号:11618167 上传时间:2023-03-28 格式:DOCX 页数:9 大小:17.17KB
下载 相关 举报
数据结构实验报告递归和非递归遍历二叉树.docx_第1页
第1页 / 共9页
数据结构实验报告递归和非递归遍历二叉树.docx_第2页
第2页 / 共9页
数据结构实验报告递归和非递归遍历二叉树.docx_第3页
第3页 / 共9页
数据结构实验报告递归和非递归遍历二叉树.docx_第4页
第4页 / 共9页
数据结构实验报告递归和非递归遍历二叉树.docx_第5页
第5页 / 共9页
点击查看更多>>
下载资源
资源描述

数据结构实验报告递归和非递归遍历二叉树.docx

《数据结构实验报告递归和非递归遍历二叉树.docx》由会员分享,可在线阅读,更多相关《数据结构实验报告递归和非递归遍历二叉树.docx(9页珍藏版)》请在冰豆网上搜索。

数据结构实验报告递归和非递归遍历二叉树.docx

数据结构实验报告递归和非递归遍历二叉树

实验报告

课程名称:

数据结构实验名称:

递归和非递归遍历二叉树任课教师:

专业:

计网类班级:

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");

}

五实验中遇到的问题及解决方法:

(注:

如有则写,无则可省)

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育 > 家庭教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1