数据结构与算法实验二叉树基本操作Word文档格式.docx

上传人:b****6 文档编号:21088163 上传时间:2023-01-27 格式:DOCX 页数:14 大小:246.65KB
下载 相关 举报
数据结构与算法实验二叉树基本操作Word文档格式.docx_第1页
第1页 / 共14页
数据结构与算法实验二叉树基本操作Word文档格式.docx_第2页
第2页 / 共14页
数据结构与算法实验二叉树基本操作Word文档格式.docx_第3页
第3页 / 共14页
数据结构与算法实验二叉树基本操作Word文档格式.docx_第4页
第4页 / 共14页
数据结构与算法实验二叉树基本操作Word文档格式.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

数据结构与算法实验二叉树基本操作Word文档格式.docx

《数据结构与算法实验二叉树基本操作Word文档格式.docx》由会员分享,可在线阅读,更多相关《数据结构与算法实验二叉树基本操作Word文档格式.docx(14页珍藏版)》请在冰豆网上搜索。

数据结构与算法实验二叉树基本操作Word文档格式.docx

以字符(其中‘#’表示虚节点)的形式输入,以创建二叉树;

在输入二叉树节点前,必须先确定该序列能正确创建二叉树。

② 

输出的形式:

在所有三种操作中都显示操作是否正确以及操作后二叉树的内容。

③ 

程序所能达到的功能:

完成二叉树的生成、遍历(包括先序、后序、中序、层次四种方式)、计算等基本操作。

④ 

测试数据:

创建操作中依次输入a,b,d,#,g,#,#,#,c,e,#,#,f,#,#生成一个二叉树。

2.概要设计 

1)为了实现上述程序功能,需要定义二叉树的抽象数据类型:

ADT 

BitTree 

数据对象:

由一个根节点和两个互不相交的左右子树构成 

数据关系:

结点具有相同的数据类型及层次结构 

基本操作:

VoidBinTreeInit(BitTree*T) 

初始条件:

无 

操作结果:

初始化一棵二叉树 

VoidBinTreeCreat(BitTree*T) 

二叉树T已存在 

按先序次序创建一棵二叉树

2)本程序包含7个函数:

①主函数main() 

②初始化二叉树函数BinTreeInit() 

③建立一棵二叉树函数BinTreeCreat() 

④先序遍历函数PreOrderTraverse() 

⑤中序遍历函数InOrderTraverse()⑥后序遍历函数PostOrderTraverse()⑦层次遍历函数LevelOrderTraverse()⑧求二叉树深度函数Countlevel()⑨检验空树函数BinTreeEmpty()⑩求节点数函数Countnode()

函数说明

#include<

stdio.h>

stdlib.h>

typedefcharDatatype;

typedefstructNodeType

{

Datatypedata;

structNodeType*lchild;

structNodeType*rchild;

}BiTNode;

typedefBiTNode*BinTree;

//初始化二叉树。

即把树指针置空

voidBinTreeInit(BiTNode*T)

//BiTNode*T;

T=(BiTNode*)malloc(sizeof(BiTNode));

T=NULL;

}

//二叉树的建立

BinTreeCreateBiTNode()

BiTNode*T;

Datatypech;

ch=getchar();

if(ch=='

#'

)T=NULL;

else{

if(!

(T=(BiTNode*)malloc(sizeof(BiTNode))))printf("

Error!

"

);

T->

data=ch;

lchild=CreateBiTNode();

rchild=CreateBiTNode();

}

returnT;

//先序遍历

voidPreOrderTraverse(BiTNode*p){

if(p!

=NULL){

printf("

%c"

p->

data);

PreOrderTraverse(p->

lchild);

rchild);

}

//中序遍历

voidInOrderTraverse(BiTNode*p){

InOrderTraverse(p->

//后序遍历

voidPostOrderTraverse(BiTNode*p){

PostOrderTraverse(p->

//层序遍历

voidLevelOrderTraverse(BiTNode*T){

BiTNode*queue[500],*p=T;

intfront=0,rear=0;

queue[++rear]=p;

//根结点入队

while(front<

rear){

p=queue[++front];

if(p->

lchild!

=NULL)queue[++rear]=p->

lchild;

//左结点入队

rchild!

rchild;

//计算结点数

intCountnode(BiTNode*T){

intsum;

if(T==NULL)return0;

sum=1+Countnode(T->

lchild)+Countnode(T->

return(sum);

//计算叶子数

intCountleaf(BiTNode*T)

else

if(T->

lchild==NULL&

&

T->

rchild==NULL)return1;

returnCountleaf(T->

lchild)+Countleaf(T->

//计算深度

intCountlevel(BiTNode*T){

intk;

if(Countlevel(T->

lchild)>

Countlevel(T->

rchild))

k=1+Countlevel(T->

elsek=1+Countlevel(T->

returnk;

//检验二叉树是否为空

intBinTreeEmpty(BiTNode*T)

if(T==NULL)

return1;

return0;

//清空二叉树

voidBinTreeClear(BiTNode*T)

{

return;

lchild)

BinTreeClear(T->

free(T->

rchild)

intmain(){

intcmd,mode,res,flag;

while

(1){

===============菜单==============\n"

\t1:

初始化\n\t2:

创建\n\t3:

遍历\n\t4:

计算\n\t5:

检验空树\n\t6:

清除二叉树\n\t0:

退出\n"

请输入命令序号:

\n"

scanf("

%d"

&

cmd);

getchar();

switch(cmd){

case1:

BinTreeInit(T);

初始化二叉树成功!

getchar();

break;

case2:

创建。

按扩展二叉树的先序遍历序列输入结点,#表示虚结点\n"

T=CreateBiTNode();

//S=T;

getchar();

break;

case3:

遍历。

输入遍历模式,1先序,2中序,3后序,4层序:

mode);

switch(mode){

PreOrderTraverse(T);

putchar('

\n'

InOrderTraverse(T);

PostOrderTraverse(T);

case4:

LevelOrderTraverse(T);

default:

模式选择有误!

计算。

输入具体计算项目,1结点数,2叶子数,3高度:

res=Countnode(T);

结点总数为:

%d\n"

res);

res=Countleaf(T);

叶子总数为:

res=Countlevel(T);

树的高度为:

选择项目有误!

case5:

flag=BinTreeEmpty(T);

if(flag==0)

二叉树不为空!

二叉树为空!

case6:

BinTreeClear(T);

T=NULL;

//改变头结点指向,free函数不会改变头结点指向,所以需要令T=NULL使得T不再指向那些被释放掉的空间,使得程序能正常运行

printf("

二叉树二叉树清除成功!

case0:

exit(0);

}程序流程图

调试报告

发现问题:

在执行清空二叉树的函数后,再执行判断空树的函数时,输出"

”,与预期实验结果不符,而编译和组建时均为发出错误和警告信号。

调试:

经过单步运行调试后,发现是清空二叉树的函数出了问题,原因是:

free函数不会改变头结点指向。

解决方案:

令T=NULL使得T不再指向那些被释放掉的空间,使得程序能正常运行。

结果:

修改完毕后现已得到正确结果"

”。

使用说明

操作界面

初始化二叉树

创建一棵二叉树

先序遍历

中序遍历

后序遍历

层序遍历

求结点数

求叶子节点数

求二叉树的深度

检验空树

清空二叉树

检验空链表

退出

心得体会

1. 

程序编写时,必须要细心。

有时候问题出现了,可能会一直查不出来,自己也不容易发现。

在编写这个程序时,我就出现了这个问题,之后一定要尽量避免此类问题出现。

2.加强练习,提高能力。

这几个子函数的名称都是我边看着书边写的,还没有完全脱离书本,把这个程序真正变成自己建的东西,所以我还要加强记忆,加强练习。

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

当前位置:首页 > 幼儿教育 > 少儿英语

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

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