用递归和非递归算法实现二叉树地三种遍历.docx
- 文档编号:384842
- 上传时间:2022-10-09
- 格式:DOCX
- 页数:16
- 大小:79.69KB
用递归和非递归算法实现二叉树地三种遍历.docx
《用递归和非递归算法实现二叉树地三种遍历.docx》由会员分享,可在线阅读,更多相关《用递归和非递归算法实现二叉树地三种遍历.docx(16页珍藏版)》请在冰豆网上搜索。
用递归和非递归算法实现二叉树地三种遍历
《数据结构与算法》实验报告三
——二叉树的操作与应用
一.实验目的
熟悉二叉链表存储结构的特征,掌握二叉树遍历操作与其应用
二.实验要求〔题目〕
说明:
以下题目中〔一〕为全体必做,〔二〕〔三〕任选其一完成
(一)从键盘输入二叉树的扩展先序遍历序列,建立二叉树的二叉链表存储结构;
(二)分别用递归和非递归算法实现二叉树的三种遍历;
(三)模拟WindowsXP资源管理器中的目录管理方式,模拟实际创建目录结构,并以二叉链表形式存储,按照凹入表形式打印目录结构〔以扩展先序遍历序列输入建立二叉链表结构〕,如如下图所示:
(根本要求:
限定目录名为单字符;扩展:
允许目录名是多字符组合)
三.分工说明
一起编写、探讨流程图,根据流程图分工编写算法,共同讨论修改,最后上机调试修改。
四.概要设计
实现算法,需要链表的抽象数据类型:
ADTBinarytree{
数据对象:
D是具有一样特性的数据元素的集合
数据关系R:
假如D为空集,如此R为空集,称binarytree为空二叉树;
假如D不为空集,如此R为{H},H是如下二元关系;
(1)在D中存在唯一的称为根的数据元素root,它在关系H下无前驱;
(2)假如D-{root}不为空,如此存在D-{root}={D1,Dr},且D1∩Dr为空集;
(3)假如D1不为空,如此D1中存在唯一的元素x1,
(4)(D1,{H1})是一颗符合本定义的二叉树,称为根的左子树,(Dr,{Hr})是一颗符合本定义的二叉树,称为根的右子树。
根本操作:
Creatbitree(&S,definition)
初始条件:
definition给出二叉树S的定义
操作结果:
按definition构造二叉树S
counter(T)
初始条件:
二叉树T已经存在
操作结果:
返回二叉树的总的结点数
onecount(T)
初始条件:
二叉树T已经存在
操作结果:
返回二叉树单分支的节点数
Clearbintree(S)
初始条件:
二叉树S已经存在
操作结果:
将二叉树S清为空树
Bitreeempty(S)
初始条件:
二叉树S已经存在
操作结果:
假如S为空二叉树,如此返回TRUE,否如此返回FALSE
Bitreedepth(S,&e)
初始条件:
二叉树S已经存在
操作结果:
返回S的深度
Parent(S)
初始条件:
二叉树S已经存在,e是S中的某个结点
操作结果:
假如e是T的非根结点,如此返回它的双亲,否如此返回空
Preordertraverse(S)
初始条件:
二叉树S已经存在,Visit是对结点操作的应用函数。
操作结果:
先序遍历S,对每个结点调用函数visit一次且仅一次。
一旦visit失败,如此操作失败。
Inordertraverse(S,&e)
初始条件:
二叉树S已经存在,Visit是对结点操作的应用函数。
操作结果:
中序遍历S,对每个结点调用函数visit一次且仅一次。
一旦visit失败,如此操作失败。
Postordertraverse(&S,e)
初始条件:
二叉树S已经存在,Visit是对结点操作的应用函数。
操作结果:
后序遍历S,对每个结点调用函数visit一次且仅一次。
一旦visit失败,如此操作失败。
}ADTBinarytree
五、详细设计
扩展先序遍历:
#include
#include
#include
typedefstructbinarytree
{
chardata;
structbinarytree*lchild,*rchild;
}BiTreeNode,*BiTree;
voidCreateBiTree(BiTree*bt)
{charch;
ch=getchar();
if(ch=='.')*bt=NULL;
else
{
*bt=(BiTreeNode*)malloc(sizeof(BiTreeNode));
(*bt)->data=ch;
CreateBiTree(&((*bt)->lchild));
CreateBiTree(&((*bt)->rchild));
}
}
voidPreOder(BiTreeroot)
{if(root!
=NULL)
{printf("%4c",root->data);
PreOder(root->lchild);
PreOder(root->rchild);
}
}
main()
{
BiTreeroot;
CreateBiTree(&root);
printf("先序遍历:
\n");
PreOder(root);
}
递归算法:
#include"stdio.h"
#definePRprintf
#defineERROR0
#defineMAX100
/*============================建立各结构体===============================*/
typedefstructnode
{
chardata;/*数据域*/
structnode*lchild;
structnode*rchild;/*结点的左右指针,分别指向结点的左右孩子*/
}BTNode;
typedefBTNode*DataType;
typedefstruct
{
DataTypedata[MAX];
inttop;
}SeqStack;
SeqStack*s;
/*============================栈的操作===================================*/
SeqStack*createemptystacks()/*创建一个空栈*/
{
SeqStack*s;
s=(SeqStack*)malloc(sizeof(SeqStack));
s->top=0;
returns;
}
intstackemptys(SeqStack*s)/*判栈空*/
{
returns->top==0;
}
intstackfulls(SeqStack*s)/*判栈满*/
{
returns->top==MAX;
}
voidpushs(SeqStack*s,DataTypex)/*进栈*/
{
if(stackfulls(s))
PR("overflow\n");
else
s->data[s->top++]=x;
}
voidpops(SeqStack*s)/*退栈*/
{
if(stackemptys(s))
PR("underflow\n");
else
s->top--;
}
DataTypegettops(SeqStack*s)/*栈非空时取栈顶元素*/
{
returns->data[s->top-1];
}
/*============================建立二叉树==================================*/
BTNode*createbintree()/*输入扩大的先序序列,建立二叉树*/
{
BTNode*t;
charx;
scanf("%c",&x);
if(x=='#')
t=NULL;/*读入#,返回空指针*/
else
{
t=(BTNode*)malloc(sizeof(BTNode));/*生成结点*/
t->data=x;
t->lchild=createbintree();/*构造左子树*/
t->rchild=createbintree();/*构造右子树*/
}
return(t);
}
/*==============================树的遍历===================================*/
voidpreorder(BTNode*t)/*NLR先序遍历*/
{
if(t!
=NULL)
{
PR("%c\t",t->data);/*访问结点*/
preorder(t->lchild);/*中序遍历左子树*/
preorder(t->rchild);/*中序遍历右子树*/
}
}
/*=========================================================================*/
voidinorder(BTNode*t)/*LNR中序遍历*/
{
if(t!
=NULL)
{
inorder(t->lchild);/*中序遍历左子树*/
PR("%c\t",t->data);/*访问结点*/
inorder(t->rchild);/*中序遍历右子树*/
}
}
/*=========================================================================*/
voidpostorder(BTNode*t)/*LRN后序遍历*/
{
if(t!
=NULL)
{
postorder(t->lchild);/*后序遍历左子树*/
postorder(t->rchild);/*后序遍历右子树*/
PR("%c\t",t->data);/*访问结点*/
}
}
/*===============================主函数=============================-=======*/
voidmain()
{
BTNode*t;
intn=0;
PR("->>请输入二叉树各元素:
(例如abd##e##cf##g##)\n");//例如abd##e##cf##g##
t=createbintree();
PR("\n\n->>1.按先序遍历输出为:
\n");
preorder(t);/*NLR先序遍历*/
PR("\n按中序遍历输出为:
\n");
inorder(t);/*LNR中序遍历*/
PR("\n按后序遍历输出为:
\n");
postorder(t);/*LRN后序遍历*/
}
#include
#include
#include
#defineTRUE1
#defineFALSE0
#defineStack_Size50
#defineNUM20
typedefstructbinarytree/*定义一棵二叉树*/
{
chardata;
structbinarytree*LChild,*RChild;
}BiTNode,*BiTree;
typedefstruct/*定义顺序栈S*/
{
BiTreedata[Stack_Size];
inttop;
}SeqStack;
voidCreateBiTree(BiTree&bt)/*利用“扩展先序遍历〞创建二叉链表*/
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 递归 算法 实现 二叉 遍历