二叉树的基本操作实验

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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 )

相关文档
最新文档