数据结构二叉树实践报告1.docx
《数据结构二叉树实践报告1.docx》由会员分享,可在线阅读,更多相关《数据结构二叉树实践报告1.docx(8页珍藏版)》请在冰豆网上搜索。
数据结构二叉树实践报告1
成绩:
实验报告
课程名称:
数据结构实验
实验项目:
二叉树的建立及遍历
姓名:
专业:
班级:
学号:
计算机科学与技术学院
实验教学中心
2017年11月17日
实验项目名称:
二叉树的建立及遍历
一、实验目的:
(1)熟练掌握二叉树的建立方法;
(2)熟练掌握二叉树的遍历算法;
(3)掌握二叉树的应用算法。
二、实验内容:
(1)编写算法建立一棵二叉树的二叉链表;
(2)输出二叉树的三种遍历序列,包括递归算法、非递归算法;
(3)编写算法统计二叉树结点数、叶子数、深度。
三、实验结果分析
四、实验操作步骤
按先序遍历顺序输入建树,空节点输入#代替,采用递归建树。
输出结果为该树按先序遍历、中序遍历、后序遍历的顺序序列。
并计算输出该树的深度、叶子节点数量、总结点数量
之后按层序遍历顺序输入建立完全二叉树,采用非递归建树。
输出结果为该树按先序遍历、中序遍历、后序遍历的顺序序列。
并计算输出该树的深度、叶子节点数量、总结点数量
五、源代码
#include
#include
#include
#include
usingnamespacestd;
//二叉树定义
typedefcharElementType;
typedefstructBiTreeNode
{
ElementTypedata;
structBiTreeNode*lchild;
structBiTreeNode*rchild;
}BiTreeNode,*BiTree;
//递归的建立一棵二叉树
//输入为二叉树的先序序列
voidcreateBiTree(BiTree&T)
{
chardata;
data=getchar();
if(data=='#')
{
T=NULL;
}
else
{
T=newBiTreeNode;
T->data=data;
createBiTree(T->lchild);
createBiTree(T->rchild);
}
}
voidcreatBiTree_2(BiTree&rt,intn)
{
charroot[2];
scanf("%s",root);
rt=newBiTreeNode;
rt->data=root[0];
for(inti=2;i<=n;i++)
{
BiTreeNode*T=rt;
chartmp[2];
intnum=0,a[16];
scanf("%s",tmp);
intii=i;
while(ii)
{
a[num++]=ii%2;
ii/=2;
}
BiTreeNode*node=newBiTreeNode;
node->data=tmp[0];
node->rchild=NULL;
node->lchild=NULL;
for(intj=num-2;j>0;j--)
if(a[j])T=T->rchild;
elseT=T->lchild;
if(a[0])T->rchild=node;
elseT->lchild=node;
}
}
intNodenum(BiTreeNode*root)//二叉树节点数目
{
if(root==NULL)return0;
elsereturn1+Nodenum(root->lchild)+Nodenum(root->rchild);
}
//递归销毁一棵二叉树
voiddestroyBiTree(BiTree&T)
{
if(T)
{
destroyBiTree(T->lchild);
destroyBiTree(T->rchild);
deleteT;
T=NULL;
}
}
//递归先序遍历二叉树
voidpreOrderTraverse(constBiTree&T)
{
if(T)
{
cout<data<<"";//输出根节点值
preOrderTraverse(T->lchild);//遍历左子树
preOrderTraverse(T->rchild);//遍历右子树
}
}
//递归中序遍历二叉树
voidinOrderTraverse(constBiTree&T)
{
if(T)
{
inOrderTraverse(T->lchild);//遍历左子树
cout<data<<"";//输出根节点值
inOrderTraverse(T->rchild);//遍历右子树
}
}
//递归后序遍历二叉树
voidpostOrderTraverse(constBiTree&T)
{
if(T)
{
postOrderTraverse(T->lchild);//遍历左子树
postOrderTraverse(T->rchild);//遍历右子树
cout<data<<"";//输出根节点值
}
}
//递归求树的深度
intdepthOfBiTree(constBiTree&T)
{
intldepth;
intrdepth;
if(T==NULL)//空树
return0;
ldepth=depthOfBiTree(T->lchild);
rdepth=depthOfBiTree(T->rchild);
return(ldepth>rdepth)?
(ldepth+1):
(rdepth+1);
}
//递归求二叉树的叶子结点个数
intleafCountOfBiTree(constBiTree&T)
{
if(T==NULL)
return0;
if(T->lchild==NULL&&T->rchild==NULL)
return1;
returnleafCountOfBiTree(T->lchild)+leafCountOfBiTree(T->rchild);
}
intmain(intargc,char*argv[])
{
BiTreeT=NULL;
createBiTree(T);//建立二叉树AB#D##CE###
cout<<"先序遍历:
";//先序遍历
preOrderTraverse(T);
cout<cout<<"中序遍历:
";//中序遍历
inOrderTraverse(T);
cout<cout<<"后序遍历:
";//后序遍历
postOrderTraverse(T);
cout<cout<<"深度:
"<cout<<"叶子结点数:
"<cout<<"总结点数量:
"<destroyBiTree(T);//销毁二叉树,释放空间
intn;
scanf("%d",&n);
BiTreeTT=NULL;
creatBiTree_2(TT,n);
cout<<"先序遍历:
";//先序遍历
preOrderTraverse(TT);
cout<cout<<"中序遍历:
";//中序遍历
inOrderTraverse(TT);
cout<cout<<"后序遍历:
";//后序遍历
postOrderTraverse(TT);
cout<cout<<"深度:
"<cout<<"叶子结点数:
"<cout<<"总结点数量:
"<destroyBiTree(TT);//销毁二叉树,释放空间
system("PAUSE");
returnEXIT_SUCCESS;
}