树顺序存储完全二叉树先中后序遍历实验内容与要求.docx
《树顺序存储完全二叉树先中后序遍历实验内容与要求.docx》由会员分享,可在线阅读,更多相关《树顺序存储完全二叉树先中后序遍历实验内容与要求.docx(9页珍藏版)》请在冰豆网上搜索。
树顺序存储完全二叉树先中后序遍历实验内容与要求
数据结构实验报告
评分
满分——5分
学号:
2015111840姓名:
陈周擎专业:
计算机科学与技术
知识范畴:
树完成日期:
2016年04月28日
实验题目:
顺序存储完全二叉树先、中、后序遍历
实验内容及要求:
输入一个字符串,存储于一维数组。
以该一维数组作为完全二叉树的存储结构,实现先、中、后序遍历,输出遍历结果。
将该完全二叉树转换为二叉链表存储结构,然后基于二叉链表存储结构再次进行先、中、后序遍历并输出遍历结果。
实验目的:
掌握完全二叉树的顺序存储与链式存储结构以及遍历算法。
数据结构设计简要描述:
分别以一维数组和二叉链表为存储结构存储二叉树,并实现先序、中序、后序遍历。
算法设计简要描述:
分别以一维数组和二叉链表为存储结构存储二叉树。
以一维数组存储时,假设双亲结点的下标为i,则左儿子、右儿子的下标分别为2*i+1、2*i+2。
利用递归算法分别对左子树和右子树进行遍历。
以二叉链表为存储结构时,结点数据域存储结点数据,然后依次递归左子树和右子树。
输入/输出设计简要描述:
本实验中输入和输出分别只有一次。
输入:
输入一个字符串,存储到一维数组中
输出:
分别以一维数组和二叉链表为存储结构存储二叉树时,先序、中序、后序遍历结果。
编程语言说明:
1.编程软件,CodeBlocks16.0;
2.代码均用C++语言实现;
3.输入输出采用C++语言的cout和cin函数;
4.程序注释采用C/C++规范;
5.动态存储分配采用C++的new和delete操作符实现
主要函数说明:
voidpreorder_array(char*s,inti,intcount)//一维数组作为存储结构的前序遍历
voidmidorder_array(char*s,inti,intcount)//一维数组作为存储结构的中序遍历
voidlasorder_array(char*s,inti,intcount)//一维数组作为存储结构的后序遍历
voidtrans_tree(BiT&bt,char*s,intcount,intt)//将该完全二叉树存储结构转换
voidpreorder(BiTbt)//以二叉链表前序遍历
voidmidorder(BiTbt)//以二叉链表中序遍历
voidlasorder(BiTbt)//以二叉链表后序遍历
程序测试简要报告:
(1)测试实例1
输入:
Pleaseinput:
abcde
输出:
Preorder_array:
abdec
Midorder_array:
dbeac
Lasorder_array:
debca
Preorder:
abdec
Midorder:
dbeac
Lasorder:
debca
运行界面:
结论:
程序输出结果与期望输出结果相符。
(2)测试实例1
输入:
Pleaseinput:
abcjdhr
输出:
Preorder_array:
abjdchr
Midorder_array:
jbdahor
Lasorder_array:
jdbhrca
Preorder:
abjdchr
Midorder:
jbdahor
Lasorder:
jdbhrca
运行界面:
结论:
程序输出结果与期望输出结果相符。
(3)测试实例1
输入:
Pleaseinput:
abdnjfkrie
输出:
Preorder_array:
abnrijedfk
Midorder_array:
rnIbejafdk
Lasorder_array:
rInejbfkda
Preorder:
abnrijedfk
Midorder:
rnibejafdk
Lasorder:
rinejbfkda
运行界面:
结论:
程序输出结果与期望输出结果相符。
(4)测试实例1
输入:
Pleaseinput:
abcdefghijk
输出:
Preorder_array:
abdhiejkcfg
Midorder_array:
hdibjekafcg
Lasorder_array:
hidjkebfgca
Preorder:
abdhiejkcfg
Midorder:
hdibjekafcg
Lasorder:
hidjkebfgca
运行界面:
结论:
程序输出结果与期望输出结果相符。
源程序代码:
#include
#include
#include
usingnamespacestd;
typedefstructnode
{
chardata;//数据域
structnode*lchild;//左指针
structnode*rchild;//右指针
}*BiT,BiTNode;
voidpreorder_array(char*s,inti,intcount)//一维数组作为存储结构的前序遍历
{
if(i>count)//遍历结束时,退出
return;
cout<
preorder_array(s,2*i+1,count);//递归遍历左儿子
preorder_array(s,2*i+2,count);//递归遍历右儿子
}
voidmidorder_array(char*s,inti,intcount)//一维数组作为存储结构的中序遍历
{
if(i>count)//遍历结束时,退出
return;
midorder_array(s,2*i+1,count);//递归遍历左儿子
cout<
midorder_array(s,2*i+2,count);//递归遍历右儿子
}
voidlasorder_array(char*s,inti,intcount)//一维数组作为存储结构的后序遍历
{
if(i>count)//遍历结束时,退出
return;
lasorder_array(s,2*i+1,count);//递归遍历左儿子
lasorder_array(s,2*i+2,count);//递归遍历右儿子
cout<
}
voidtrans_tree(BiT&bt,char*s,intcount,intt)//将该完全二叉树存储结构转换为二叉链表
{
if(t>count)//遍历结束时,退出
return;
bt=newBiTNode();
bt->data=s[t];//填充结点
bt->lchild=NULL;//左儿子置空
bt->rchild=NULL;//右儿子置空
trans_tree(bt->lchild,s,count,t*2+1);//递归遍历左儿子
trans_tree(bt->rchild,s,count,t*2+2);//递归遍历右儿子
}
voidpreorder(BiTbt)//以二叉链表前序遍历
{
if(bt)//树非空
{
cout<data<<"";
preorder(bt->lchild);//递归遍历左儿子
preorder(bt->rchild);//递归遍历右儿子
}
}
voidmidorder(BiTbt)//以二叉链表中序遍历
{
if(bt)//树非空
{
midorder(bt->lchild);//递归遍历左儿子
cout<data<<"";
midorder(bt->rchild);//递归遍历右儿子
}
}
voidlasorder(BiTbt)//以二叉链表后序遍历
{
if(bt)//树非空
{
lasorder(bt->lchild);//递归遍历左儿子
lasorder(bt->rchild);//递归遍历右儿子
cout<data<<"";
}
}
intmain()
{
intcount=0,t=0;
char*str=newchar;
cout<<"pleaseinputarray:
";
cin>>str;
count=strlen(str);//求数组长度
cout<<"preorder_array:
";
preorder_array(str,0,count);
cout<cout<<"midorder_array:
";
midorder_array(str,0,count);
cout<cout<<"lasorder_array:
";
lasorder_array(str,0,count);
cout<BiTbt;
trans_tree(bt,str,count,t);
cout<cout<<"preorder:
";
preorder(bt);
cout<cout<<"midorder:
";
midorder(bt);
cout<cout<<"lasorder:
";
lasorder(bt);
cout<return0;
}