16
学年—17学年第 1 学期 数据结构
实验任务书
专业名称: 实验学时: 2
课程名称:数据结构 任课教师: 翟海霞
实验题目: 二叉树的基本操作实现
实验环境: Visual C++ 6.0
实验目的:掌握二叉树的二叉链存储结构及表示。
掌握二叉树的三种遍历算法(递归和非递归两类)。
运用三种遍历的方法求解二叉树的有关问题。
实验内容:实现二叉树的二叉链表存储结构;
实现先序、中序和后序遍历二叉树;
遍历二叉树的应用:计算叶子结点、左右子树交换等。
要求:1、二叉树基本操作已实现,学习和进一步理解。
2 、在求总结点的程序中加入求叶子结点的功能。
3 、左右子树交换,按中序和后序是否也可以?
4 、选作:按层遍历二叉树。
#include<stdio.h>
#include<stdlib.h>
#define MAX 100
#include<queue>
#define OK 1;
char ch;
//二叉树存储结构
typedef struct BiTNode{
char date;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
//创建二叉链表表示的二叉树
//Status CreateBiTree(BiTree &T)
void CreateBiTree(BiTree &T)
{
scanf("%c",&ch);
if(ch=='#')
T=NULL;//递归结束,建立空树
else
{ T=(BiTree)malloc(sizeof(BiTNode));//生成根节点
T->date=ch;//根节点数据域置为ch
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}
//先序遍历
void PreTra(BiTree T)
{
if(T)
{
printf("%c",T->date);
PreTra(T->lchild);
PreTra(T->rchild);
}
}
//中序遍历
void InTra(BiTree T)
{
if(T)
{
InTra(T->lchild);
printf("%c",T->date);
InTra(T->rchild);
}
}
//后序遍历
void PostTra(BiTree T)
{
if(T)
{
PostTra(T->lchild);
PostTra(T->rchild);
printf("%c",T->date);
}
}
//层序遍历
void LevelTra(BiTree T)
{
BiTree Q[MAX];
int front=0,rear=0;
BiTree p;
//根节点入队
if(T)
{
Q[rear]=T;
rear=(rear+1)%MAX;//插入节点为新的队尾元素
}
while(front!=rear)
{
//队头元素出队
p=Q[front];
front=(front+1)%MAX; //删除头结点
printf("%c",p->date);
//左孩子不为空,入队
if(p->lchild)
{
Q[rear]=p->lchild;
rear=(rear+1)%MAX;//插入左孩子结点为新的队尾元素
}
if(p->rchild)
{
Q[rear]=p->rchild;
rear=(rear+1)%MAX;
}
}
}
//计算节点数
int NodeCount(BiTree T)
{
if(T==NULL) return 0;
else
return NodeCount(T->lchild)+NodeCount(T->rchild)+1;
}
//交换左右子树
void Exchange(BiTree &T)
{
if(T){
BiTree s;
s=T->lchild;
T->lchild=T->rchild;
T->rchild=s;
Exchange(T->lchild);
Exchange(T->rchild);
}
}
//主菜单函数
void menu()
{
printf("1.建立二叉树\n");
printf("2.先序遍历二叉树\n");
printf("3.中序遍历二叉树\n");
printf("4.后序遍历二叉树\n");
printf("5.层序遍历\n");
printf("6.计算二叉树节点数\n");
printf("7.交换左右子树\n");
}
//主函数 ABC##DE#G##F####
int main()
{
printf("\n************************二叉树基本操作实现*******************\n\n");
int n,num;
BiTree T=NULL;
menu();
while(1)
{
printf("请输入你的选择:\n");
scanf("%d",&n);
switch(n)
{
case 1:{
printf("输入各元素,空子树用#表示:\n");
CreateBiTree(T);
printf("创建成功!\n\n");
}break;
case 2:{
printf("先序遍历:");
PreTra(T);printf("\n\n");
}break;
case 3:{
printf("中序遍历:");
InTra(T);
printf("\n\n");
}break;
case 4:{
printf("后序遍历:");
PostTra(T);
printf("\n\n");
}break;
case 5:{
printf("层序遍历:");
LevelTra(T);
printf("\n\n");
}break;
case 6:{
num=NodeCount(T);
printf("结点数为:%d",num);
printf("\n\n");
}break;
case 7:{
printf("交换左右子树:");
Exchange(T);
printf("交换成功!\n\n");
}break;
case 0:exit(0);
default: printf("无效输入!\n\n");
}
}
return 0;
}