版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Wofficre/article/details/78897845
题目如下:
课程名称:数据结构
实验项目名称:二叉树基本操作的实现
实验目的:
1.掌握树的基本操作—遍历。
实验要求:
1、 分别用递归和非递归的方法实现一棵树的三种遍历。
实验过程:
1、 创建一棵二叉树(二叉树如下图所示);
2、 用递归算法实现对该树的三种遍历;
3、 用非递归算法实现对该树的三种遍历;
4、 输入选项:0或1,0为递归遍历,1为非递归遍历。
5、 根据输入的选项,分别调用递归或非递归算法输出先序、中序、后序遍历序列。
实验报告中给出先序和后序遍历的非递归实现算法代码。
实验结果:
1、输入:ABD##E##CF#G###(创建二叉树)
2、输入:0(递归算法)
3、输出:先序遍历:ABDECFG
中序遍历:DBEAFGC
后序遍历:DEBGFCA
4、输入:1(非递归实现)
5、输出:先序遍历:ABDECFG
中序遍历:DBEAFGC
后序遍历:DEBGFCA
实验分析:
1.分析递归与非递归实现的相同点及不同点;
2.列举调试运行过程中出现的错误并分析原因。
要求:
(1) 程序要添加适当的注释,程序的书写要采用缩进格式。
(2) 程序要具在一定的健壮性,即当输入数据非法时,程序也能适当地做出反应。
(3) 程序要做到界面友好,在程序运行时用户可以根据相应的提示信息进行操作。
(4) 上传源程序到课堂派。顺序表的源程序保存为TraversalBTree.cpp。
代码如下:
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
#define OK 1
#define ERROR 0
typedef char TElemType;
typedef int Status;
//定义二叉树
typedef struct BiTNode
{
TElemType data;
int tag;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
//创建二叉树
void CreateBiTree(BiTree &T)
{
char c;
cin>>c;
if(c=='#')
{
T=NULL;
}
else
{
T=new BiTNode;
T->data=c;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}
//创建一个栈
typedef struct Stack
{
BiTree data;
struct Stack *next;
}Stack,*StackNode;
//初始化栈
Status InitStack(StackNode &S)
{
S=NULL;
return OK;
}
//进栈操作
Status Push(StackNode &S,BiTree c)
{
StackNode p1;
p1=new Stack;
p1->data=c;
p1->next=S;
S=p1;
return OK;
}
//出栈操作
BiTree Pop(StackNode &S)
{
BiTree q;
StackNode p2;
p2=new Stack;
q=S->data;
p2=S->next;
S=p2;
return q;
}
//访问栈顶元素的操作
BiTree Get(StackNode &S)
{
BiTree q;
q=S->data;
return q;
}
//非递归中序遍历
Status InOrderTraverse1(BiTree T)
{
StackNode S;
S=new Stack;
InitStack(S);
BiTree p,q;
p=T;
q=new BiTNode;
while(p||S)
{
if(p)
{
Push(S,p);
p=p->lchild;
}
else
{
q=Pop(S);
cout<<q->data;
p=q->rchild;
}
}
return OK;
}
//非递归先序遍历
Status PreOrderTraverse1(BiTree T)
{
StackNode S;
S=new Stack;
InitStack(S);
BiTree p,q;
p=T;
q=new BiTNode;
while(p||S)
{
if(p)
{
cout<<p->data;
Push(S,p);
p=p->lchild;
}
else
{
q=Pop(S);
p=q->rchild;
}
}
return OK;
}
//非递归后序遍历
Status PostOrderTraverse1(BiTree T)
{
StackNode S;
S=new Stack;
InitStack(S);
BiTree p,q;
p=T;
q=new BiTNode;
while(p||S)
{
if(p)
{
Push(S,p);
p->tag=0;
p=p->lchild;
}
else
{
if(S)
{
q=Pop(S);
p=q;
if(p->tag==1)
{
cout<<p->data;
p=NULL;
}
else
{
p->tag=1;
Push(S,p);
p=p->rchild;
}
}
}
}
return OK;
}
//二叉树先序遍历
void PreOrderTraverse(BiTree T)
{
if(T)
{
cout<<T->data;
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}
//二叉树中序遍历
void InOrderTraverse(BiTree T)
{
if(T)
{
InOrderTraverse(T->lchild);
cout<<T->data;
InOrderTraverse(T->rchild);
}
}
//二叉树后序遍历
void PostOrderTraverse(BiTree T)
{
if(T)
{
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
cout<<T->data;
}
}
int main()
{
int choice;
BiTree T;
printf("请输入操作命令(0为递归遍历,1为非递归遍历):");
scanf("%d",&choice);
if(choice==0)
{
printf("请创建二叉树:");
CreateBiTree(T);
printf("\n");
PreOrderTraverse(T);
printf("\n");
InOrderTraverse(T);
printf("\n");
PostOrderTraverse(T);
}
if(choice==1)
{
printf("请创建二叉树:");
CreateBiTree(T);
PreOrderTraverse1(T);
printf("\n");
InOrderTraverse1(T);
printf("\n");
PostOrderTraverse1(T);
printf("\n");
}
}