实验项目名称:二叉树基本操作的实现
实验目的:1、掌握树的基本操作----遍历
实验要求:1、分别用递归和非递归的方法实现一棵树的三种遍历
实验过程:1、创建一颗二叉树;
2、用递归算法实现对该树的三种遍历;
3、用非递归算法实现对该树的三种遍历;
4、输入选项:0或1,0为递归遍历,1为非递归遍历。
5、根据输入的选项,分别调用递归或非递归算法输出先序、中序、后序遍历序列。
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define OK 1
#define TRUE 1
#define ERROR 0
#define FALSE 0
typedef char TElemType;
typedef int Status;
typedef struct BiTNode
{
TElemType data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
typedef BiTree SElemType;
typedef struct StackNode
{
BiTree data;
int tag;
struct StackNode *next;
}StackNode,*LinkStack;
Status InitStack(LinkStack &S)
{
S=NULL;
return OK;
}
Status StackEmpty(LinkStack S)
{
if(S==NULL)
return TRUE;
else
return FALSE;
}
Status Push(LinkStack &S,SElemType e)
{
LinkStack p;
p=new StackNode;
p->data=e;
p->tag=0;
p->next=S;
S=p;
return OK;
}
Status Pop(LinkStack &S,SElemType &e)
{
LinkStack p;
if(S==NULL) return ERROR;
e=S->data;
p=S;
S=S->next;
delete p;
return OK;
}
LinkStack GetTop(LinkStack S)
{
if(S==NULL)
return NULL;
else
return S;
}
//创建二叉树
Status CreateBiTree(BiTree &T)
{
char ch;
scanf("%c",&ch);
if(ch=='#')
T=NULL;
else
{
T=new BiTNode;
T->data=ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
return OK;
}
//先序递归
Status preOrderTraverse(BiTree T)
{
if(T==NULL) //若二叉树非空
return OK;
else
{
printf("%c",T->data);
preOrderTraverse(T->lchild); //遍历左子树
preOrderTraverse(T->rchild); //遍历右子树
}
}
//中序递归
Status InOrderTraverse(BiTree T)
{
if(T==NULL)
return OK;
else
{
InOrderTraverse(T->lchild);
printf("%c",T->data);
InOrderTraverse(T->rchild);
}
}
//后序递归
Status lastOrderTraverse(BiTree T)
{
if(T==NULL)
return OK;
else
{
lastOrderTraverse(T->lchild);
lastOrderTraverse(T->rchild);
printf("%c",T->data);
}
}
//先序非递归
Status preOrder(BiTree T)
{
LinkStack S;
BiTree p;
InitStack(S);
p=T;
while(p||!StackEmpty(S))
{
if(p) //p非空
{
Push(S,p); //根指针进栈
printf("%c",p->data); //访问根结点
p=p->lchild;
}
else //p为空
{
Pop(S,p); //退栈
p=p->rchild;
}
}
return OK;
}
//中序非递归
Status InOrder(BiTree T)
{
LinkStack S;
BiTree p;
InitStack(S);
p=T;
while(p||!StackEmpty(S))
{
if(p) //p非空
{
Push(S,p); //根指针进栈
p=p->lchild;
}
else //p为空
{
Pop(S,p); //退栈
printf("%c",p->data); //访问根结点
p=p->rchild;
}
}
}
//后序非递归
Status LastOrder(BiTree T)
{
LinkStack q,S;
BiTree p;
InitStack(S); //建立空栈
p=T;
while(p||!StackEmpty(S))
{
if(p)
{
Push(S,p);
p=p->lchild;
}
else
{
q=GetTop(S);
if(q->tag==0)
{
q->tag=1;
p=q->data;
p=p->rchild;
}
else
{
Pop(S,p);
printf("%c",p->data);
p=NULL; //记得置空,不然没输出
}
}
}
return OK;
}
int main()
{
int a;
BiTree T;
CreateBiTree(T);
printf("二叉树建立成功\n");
printf("请选择‘0’或‘1’,0表示递归,1表示非递归\n");
scanf("%d",&a);
switch(a)
{
case 0:
{
printf("\n前序遍历结果:\n");
preOrderTraverse(T);
printf("\n中序遍历结果:\n");
InOrderTraverse(T);
printf("\n后序遍历结果:\n");
lastOrderTraverse(T);
}break;
case 1:
{
printf("\n前序遍历结果:\n");
preOrder(T);
printf("\n中序遍历结果:\n");
InOrder(T);
printf("\n后序遍历结果:\n");
LastOrder(T);
}break;
default: printf("error\n");
}
return 0;
}
程序运行及试验结果: