实验报告5二叉树操作.docx
- 文档编号:9663231
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:14
- 大小:34.45KB
实验报告5二叉树操作.docx
《实验报告5二叉树操作.docx》由会员分享,可在线阅读,更多相关《实验报告5二叉树操作.docx(14页珍藏版)》请在冰豆网上搜索。
实验报告5二叉树操作
实验说明
二叉树的基本操作
一.实验内容:
实现创建和遍历二叉树的基本操作
二.实验目的:
(1)掌握二叉树的定义和存储表示,学会建立一棵特定二叉树的方法;
(2)掌握二叉树的遍历算法(先序、中序、后序遍历算法)的思想,并学会遍历算法的递归实现和非递归实现。
三.问题描述:
(1)编程实现构造一棵二叉树的算法,按照完全先序输入的序列建立二叉树。
(2)编程实现在二叉链表这种存储方式下,实现二叉的遍历(先序、中序、后序),可采用递归或者非递归实现,求出二叉树的深度、叶子结点数、总的结点数、交换左右子树。
四.问题的实现
//test5-BiTree.cpp:
Definestheentrypointfortheconsoleapplication.
//
#include"stdafx.h"
#include
#include
#include"string.h"
typedefstructBinnode{
//二叉树结点结构体
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);
Creat_Bintree(&(*root)->rchild);
}
}
/////*******************************************/
/////*按照前序递归遍历二叉树*/
/////*******************************************/
voidPreorder1(Bintreet)
{
if(t!
=NULL)
{
printf("%c",t->data);
Preorder1(t->lchild);
Preorder1(t->rchild);
}
}
/////*******************************************/
/////*按照中序递归遍历二叉树*/
/////*******************************************/
voidInorder1(Bintreet)
{
if(t!
=NULL)
{
Inorder1(t->lchild);
printf("%c",t->data);
Inorder1(t->rchild);
}
}
/////*******************************************/
/////*按照后序递归遍历二叉树*/
/////*******************************************/
voidPosorder1(Bintreet)
{
if(t!
=NULL)
{
Posorder1(t->lchild);
Posorder1(t->rchild);
printf("%c",t->data);
}
}
/////*******************************************/
/////*按照前序非递归遍历二叉树*/
/////*******************************************/
voidPreorder2(Bintreet)
{
Bintreepre=t;
stacks;
s.top=0;
printf("输出前序遍历序列:
");
while(pre||s.top>0)
{
if(pre)
{
printf("%c",pre->data);
s.data[s.top++]=pre;
pre=pre->lchild;
}
else
{
pre=s.data[--s.top]->rchild;
}
}
printf("\n\n");
}
/////*******************************************/
/////*按照中序非递归遍历二叉树*/
/////*******************************************/
voidInorder2(Bintreet)
{
Bintreepre=t;
stacks;
s.top=0;
printf("输出中序遍历序列:
");
while(pre||s.top>0)
{
if(pre)
{
s.data[s.top++]=pre;
pre=pre->lchild;
}
else
{
pre=s.data[--s.top];
printf("%c",pre->data);
pre=pre->rchild;
}
}
printf("\n\n");
}
/////*******************************************/
/////*按照后序非递归遍历二叉树*/
/////*******************************************/
voidPosorder2(Bintreet)
{
stacks;
s.top=-1;
printf("输出后序遍历序列:
");
while(t!
=NULL||s.top!
=-1)
{
while(t)
{
s.top++;
s.flag[s.top]=0;
s.data[s.top]=t;
t=t->lchild;
}
while(s.top>=0&&s.flag[s.top]==1)
{
t=s.data[s.top];
printf("%c",t->data);
s.top--;
}
if(s.top>=0)
{
t=s.data[s.top];
s.flag[s.top]=1;
t=t->rchild;
}
else
{
t=NULL;
}
}
printf("\n\n");
}
/////*******************************************/
/////*按照层次遍历二叉树*/
/////*******************************************/
voidLevelorder(Bintreet)
{
queueq;
q.data[0]=t;
q.front=0;q.rear=1;
printf("层次遍历二叉树结果:
");
while(q.front { if(q.data[q.front]) { printf("%c",q.data[q.front]->data); q.data[q.rear++]=q.data[q.front]->lchild; q.data[q.rear++]=q.data[q.front]->rchild; q.front++; } else { q.front++; } } printf("\n\n"); } /////*******************************************/ /////*递归法将二叉树的左右子树互换*/ /////*******************************************/ voidExchange1(Bintreet) { Bintreetemp; if(t) { Exchange1(t->lchild); Exchange1(t->rchild); temp=t->lchild; t->lchild=t->rchild; t->rchild=temp; } } /////*******************************************/ /////*非递归法将二叉树的左右子树互换*/ /////*******************************************/ voidExchange2(Bintreet) { Bintreetemp; stacks; s.top=0; while(t||s.top) { if(t) { s.data[s.top++]=t; temp=t->lchild; t->lchild=t->rchild; t->rchild=temp; t=t->lchild; } else { t=s.data[--s.top]->rchild; } } } /////*******************************************/ /////*递归法求叶子结点个数*/ /////*******************************************/ intLeaves_Num1(Bintreet) { if(t) { if(t->lchild==NULL&&t->rchild==NULL) { return1; } returnLeaves_Num1(t->lchild)+Leaves_Num1(t->rchild); } return0; } /////*******************************************/ /////*非递归法求叶子结点个数*/ /////*******************************************/ intLeaves_Num2(Bintreet) { intcount=0; stacks; s.top=0; while(t||s.top>0) { if(t) { s.data[s.top++]=t; if(t->lchild==NULL&&t->rchild==NULL) { count++; } t=t->lchild; } else { t=s.data[--s.top]->rchild; } } 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; } else { lh=Depth(t->lchild); rh=Depth(t->rchild); return(lh>rh? lh: rh)+1; } } intmain() { //完全前序输入创建二叉树 intcount=0,the_depth=0,nodeNumber=0; Bintreet; printf("输入完全前序序列创建二叉树(空结点输入''): "); Creat_Bintree(&t); //前序递归遍历二叉树 count=Leaves_Num2(t); printf("该二叉树的叶子结点数为: %d\n",count); Preorder1(t); /////*按照中序递归遍历二叉树*/ Inorder1(t); /////*按照后序递归遍历二叉树*/ Posorder1(t); /////*按照前序非递归遍历二叉树*/ Preorder2(t); /////*按照中序非递归遍历二叉树*/ Inorder2(t); /////*按照后序非递归遍历二叉树*/ Posorder2(t); //叶子节点计数 count=Leaves_Num1(t); printf("叶子节点数: %d\n",count); //计算树的深度 the_depth=Depth(t); printf("二叉树的深度为: %d\n",the_depth); ///*树的结点个数*/ nodeNumber=num_of_node(t); printf("二叉树的结点数为: %d\n",nodeNumber); /////*按照层次遍历二叉树*/ Levelorder(t); printf("原二叉树的中序遍历: \n"); /////*按照中序递归遍历二叉树*/ Inorder1(t); printf("\n"); /////*递归法将二叉树的左右子树交换 Exchange1(t); printf("递归法将二叉树的左右子树交换后二叉树的中序遍历: \n"); /////*非递归法将二叉树的左右子树互换*/ Inorder1(t); printf("\n"); return0; } ABC**DE*G**F***(*表示空节点,通过输入空格实现)。 实验中遇到的问题及解决方法 实验结果如下: 实验总结(结果和心得体会) 1.学会3种遍历算法以及如何求深度和叶子数的算法; 2.学习时要学会其思想,掌握其运行过程。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 报告 二叉 操作