二叉树的基本操作实验
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验三二叉树的基本运算
一、实验目的
1、使学生熟练掌握二叉树的逻辑结构和存储结构。
2、熟练掌握二叉树的各种遍历算法。
二、实验内容
[问题描述]
建立一棵二叉树,试编程实现二叉树的如下基本操作:
1. 按先序序列构造一棵二叉链表表示的二叉树T;
2. 对这棵二叉树进行遍历:先序、中序、后序以及层次遍历,分别输出结点的遍历序列;
3. 求二叉树的深度/结点数目/叶结点数目;(选做)
4. 将二叉树每个结点的左右子树交换位置。(选做)
[基本要求]
从键盘接受输入(先序),以二叉链表作为存储结构,建立二叉树(以先序来建立),
[测试数据]
如输入:ABCффDEфGффFффф(其中ф表示空格字符)
则输出结果为
先序:ABCDEGF
中序:CBEGDFA
后序:CGEFDBA
层序:ABCDEFG
[选作内容]
采用非递归算法实现二叉树遍历。
三、实验前的准备工作
1、掌握树的逻辑结构。
2、掌握二叉树的逻辑结构和存储结构。
3、掌握二叉树的各种遍历算法的实现。
一实验分析
本次试验是关于二叉树的常见操作,主要是二叉树的建立和遍历。二叉树的遍历有多种方法,本次试验我采用递归法,递归法比较简单。
二概要设计
功能实现
1.int CreatBiTree(BiTree &T) 用递归的方法先序建立二叉树, 并用链表储存该二叉树
2.int PreTravel(BiTree &T) 前序遍历
3. int MidTravel(BiTree &T) 中序遍历
4.int PostTravel(BiTree &T) 后序遍历
5.int Depth(BiTree &T) //计算树的深度
6.int howmuch(BiTree T,int h) 采用树节点指针数组,用于存放遍历到的元素地址,如果有左孩子,存入地址,j加一,否则没操作,通过访问数组输出层次遍历的结果。k计算叶子数,j为总节点。
7. int exchang(BiTree &T) 交换左右子树,利用递归,当有左右孩子时才交换
三详细设计
#include
#include
typedef struct BiTNode
{
char data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
int CreatBiTree(BiTree &T)
{//先序法创建二叉树
char ch;
if((ch=getchar())==' ')
T=NULL;
else
{
T=(BiTNode*)malloc(sizeof(BiTNode));
if(!T)
exit(1);
T->data=ch;
CreatBiTree(T->lchild);
CreatBiTree(T->rchild);
}
return 0;
}
int PreTravel(BiTree &T)
{//前序遍历
if(T)
{
printf("%c",T->data);
PreTravel(T->lchild);
PreTravel(T->rchild);
}
return 0;
}
int MidTravel(BiTree &T)
{//中序遍历
if(T)
{
MidTravel(T->lchild);
printf("%c",T->data);
MidTravel(T->rchild);
}
return 0;
}
int PostTravel(BiTree &T)
{//后序遍历
if(T)
{
PostTravel(T->lchild);
PostTravel(T->rchild);
printf("%c",T->data);
}
return 0;
}
int howmuch(BiTree T,int h)
{
BiTNode *Q[100];//树节点指针数组,用于存放遍历到的元素地址
if(T==NULL)
printf("空的二叉树\n");
Q[0]=T; //存入树根
int i,k=0;
int j=1; //j为总节点
for(i=0;i { if(Q[i]->lchild!=NULL) //如果有左孩子,存入地址,j加一,否则没操作 { Q[j]=Q[i]->lchild ; j++; } if(Q[i]->rchild!=NULL) //如果有右孩子,存入地址,j加一,否则没操作 { Q[j]=Q[i]->rchild ; j++; } if(Q[i]->lchild==NULL&&Q[i]->rchild==NULL) k++; //计算叶子数 } if(h==0) printf("%d", j); else if(h==1) printf("%d",k); else if(h==2) { for(i=0;i printf("%c",Q[i]->data); } else { printf("参数错误"); } return 0; } int Depth(BiTree &T) //计算树的深度 { int lh , rh ; if( NULL == T )