实验报告5二叉树操作Word格式.docx
- 文档编号:22842281
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:14
- 大小:34.45KB
实验报告5二叉树操作Word格式.docx
《实验报告5二叉树操作Word格式.docx》由会员分享,可在线阅读,更多相关《实验报告5二叉树操作Word格式.docx(14页珍藏版)》请在冰豆网上搜索。
chardata;
structBinnode*lchild;
structBinnode*rchild;
};
typedefBinnode*Bintree;
typedefstructstack{
//二叉树结点栈
Bintreedata[100];
intflag[100];
inttop;
typedefstructqueue{
//二叉树结点队列
Bintreedata[30];
intfront;
intrear;
structBTNode
{
intdata;
structBTNode*pLchild;
//p是指针,L是左,child是孩子
structBTNode*pRchild;
//*******************************************/
//*按照前序遍历建立二叉树*/
voidCreat_Bintree(Bintree*root)
charch;
if((ch=getchar())=='
'
)
{
*root=NULL;
}
else
*root=(Binnode*)malloc(sizeof(Binnode));
(*root)->
data=ch;
Creat_Bintree(&
(*root)->
lchild);
rchild);
}
/////*******************************************/
/////*按照前序递归遍历二叉树*/
voidPreorder1(Bintreet)
if(t!
=NULL)
printf("
%c"
t->
data);
Preorder1(t->
/////*按照中序递归遍历二叉树*/
voidInorder1(Bintreet)
Inorder1(t->
/////*按照后序递归遍历二叉树*/
voidPosorder1(Bintreet)
Posorder1(t->
/////*按照前序非递归遍历二叉树*/
voidPreorder2(Bintreet)
Bintreepre=t;
stacks;
s.top=0;
printf("
输出前序遍历序列:
"
);
while(pre||s.top>
0)
if(pre)
{
printf("
pre->
s.data[s.top++]=pre;
pre=pre->
lchild;
}
else
pre=s.data[--s.top]->
rchild;
\n\n"
/////*按照中序非递归遍历二叉树*/
voidInorder2(Bintreet)
输出中序遍历序列:
pre=s.data[--s.top];
/////*按照后序非递归遍历二叉树*/
voidPosorder2(Bintreet)
s.top=-1;
输出后序遍历序列:
while(t!
=NULL||s.top!
=-1)
while(t)
s.top++;
s.flag[s.top]=0;
s.data[s.top]=t;
t=t->
while(s.top>
=0&
&
s.flag[s.top]==1)
t=s.data[s.top];
s.top--;
if(s.top>
=0)
s.flag[s.top]=1;
t=NULL;
/////*按照层次遍历二叉树*/
voidLevelorder(Bintreet)
queueq;
q.data[0]=t;
q.front=0;
q.rear=1;
层次遍历二叉树结果:
while(q.front<
q.rear)
if(q.data[q.front])
q.data[q.front]->
q.data[q.rear++]=q.data[q.front]->
q.front++;
/////*递归法将二叉树的左右子树互换*/
voidExchange1(Bintreet)
Bintreetemp;
if(t)
Exchange1(t->
temp=t->
t->
lchild=t->
rchild=temp;
/////*非递归法将二叉树的左右子树互换*/
voidExchange2(Bintreet)
while(t||s.top)
if(t)
s.data[s.top++]=t;
temp=t->
t->
t=s.data[--s.top]->
/////*递归法求叶子结点个数*/
intLeaves_Num1(Bintreet)
if(t->
lchild==NULL&
t->
rchild==NULL)
return1;
returnLeaves_Num1(t->
lchild)+Leaves_Num1(t->
return0;
/////*非递归法求叶子结点个数*/
intLeaves_Num2(Bintreet)
intcount=0;
while(t||s.top>
if(t->
{
count++;
}
returncount;
/////****************************************************/
/////*树的结点个数*/
intnum_of_node(Bintreet)
if(t==NULL)return0;
elsereturnnum_of_node(t->
lchild)+num_of_node(t->
rchild)+1;
/////**********************************************/
/////*求一棵树的高度*/
intDepth(Bintreet)
intlh,rh;
if(NULL==t)
return0;
lh=Depth(t->
lchild);
rh=Depth(t->
rchild);
return(lh>
rh?
lh:
rh)+1;
intmain()
//完全前序输入创建二叉树
intcount=0,the_depth=0,nodeNumber=0;
Bintreet;
输入完全前序序列创建二叉树(空结点输入'
):
Creat_Bintree(&
t);
//前序递归遍历二叉树
count=Leaves_Num2(t);
该二叉树的叶子结点数为:
%d\n"
count);
Preorder1(t);
/////*按照中序递归遍历二叉树*/
Inorder1(t);
/////*按照后序递归遍历二叉树*/
Posorder1(t);
/////*按照前序非递归遍历二叉树*/
Preorder2(t);
/////*按照中序非递归遍历二叉树*/
Inorder2(t);
/////*按照后序非递归遍历二叉树*/
Posorder2(t);
//叶子节点计数
count=Leaves_Num1(t);
叶子节点数:
count);
//计算树的深度
the_depth=Depth(t);
二叉树的深度为:
the_depth);
///*树的结点个数*/
nodeNumber=num_of_node(t);
二叉树的结点数为:
nodeNumber);
/////*按照层次遍历二叉树*/
Levelorder(t);
原二叉树的中序遍历:
\n"
/////*递归法将二叉树的左右子树交换
Exchange1(t);
递归法将二叉树的左右子树交换后二叉树的中序遍历:
/////*非递归法将二叉树的左右子树互换*/
ABC**DE*G**F***(*表示空节点,通过输入空格实现)。
实验中遇到的问题及解决方法
实验结果如下:
实验总结(结果和心得体会)
1.学会3种遍历算法以及如何求深度和叶子数的算法;
2.学习时要学会其思想,掌握其运行过程。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 报告 二叉 操作