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