C语言数据结构实现二叉树递归与非递归遍历(数据结构第四次实验)

版权声明:本文为博主原创文章,未经博主允许不得转载。 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"); 

	}
}



猜你喜欢

转载自blog.csdn.net/Wofficre/article/details/78897845