65,211
社区成员
发帖
与我相关
我的任务
分享
#define MAXSIZE 256
#include<iostream>
using namespace std;
#include<cstdlib>
typedef struct BiTNode
{
char data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
////////////////////////队列的相关操作////////////
typedef struct QNode
{
BiTNode data;
struct QNode *next;
}QNode,*QueuePtr;
typedef struct
{
QueuePtr front;
QueuePtr rear;
}LinkQueue;
bool InitQueue(LinkQueue &Q) //初始化一个空队列
{
Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));
if(!Q.front)
return false;
Q.front->next=NULL;
return true;
}
bool EnQueue(LinkQueue &Q,BiTNode e) //将元素e插入到队列中
{
QueuePtr p;
p=(QueuePtr)malloc(sizeof(QNode));
if(!p)
return false;
p->data=e;
p->next=NULL;
Q.rear->next=p;
Q.rear=p;
return true;
}
bool DeQueue(LinkQueue &Q,BiTNode &e) //出队
{
if(Q.rear==Q.front)
return false;
QueuePtr p;
p=Q.front->next;
e=p->data;
Q.front->next=p->next;
if(Q.rear==p) Q.rear=Q.front;
free(p);
return true;
}
////////////////二叉树的操作////////////////////
BiTree CreatTree(char A[],char B[],int n) //由先序和中序序列创建二叉树
{
BiTree T;
int i;
if(n<=0)
return 0;
T=(BiTree)malloc(sizeof(BiTNode));
if(!T)
return 0;
T->data=*A;
for(i=0;i <n;i++)
{
if( A[0]== B[i]) break;
}
T->lchild=CreatTree(A+1,B,i);
T->rchild=CreatTree(A+i+1,B+i+1,n-i-1);
return T;
}
void PrintTree(BiTree T,int i) //按6.69要求打印
{
if(T->rchild)
PrintTree(T->rchild,i+1);
for(int j=1;j<=i;j++)
cout<<" ";
cout<<T->data<<endl;;
if(T->lchild)
PrintTree(T->lchild,i+1);
}
void Postorder (BiTree T)
{
if (T!=NULL)
{
Postorder(T->lchild); //后序遍历根的左子树
Postorder(T->rchild); //后序遍历根的右子树
cout<<T->data;//访问根结点
}//if
}//postorder
void Levelorder(BiTree T) //层序遍历
{
LinkQueue Q; //定义队列
InitQueue(Q);
if(T==NULL)
exit(-1);
BiTree p=T;
BiTNode e;
EnQueue(Q,*p);
while(Q.front!=Q.rear)
{
DeQueue(Q,e);
cout<<e.data;
if(e.lchild)
EnQueue(Q,*e.lchild);
if(e.rchild)
EnQueue(Q,*e.rchild);
}
cout<<endl;
}
//////////////////////////main///////////////////////////
int main()
{
char str1[MAXSIZE],str2[MAXSIZE];
char c;
int i=0,j=0;
BiTree Tree;
cout<<"请输入先序序列:"<<endl;
c=getchar();
while(c!='\n')
{
str1[i]=c;
i++;
c=getchar();
}
cout<<"请输入中序序列:"<<endl;
c=getchar();
while(c!='\n')
{
str2[j]=c;
j++;
c=getchar();
}
if(i!=j)
{
cerr<<"error!输入错误"<<endl;
exit(-1);
}
Tree=CreatTree(str1,str2,j);
if(Tree)
cout<<"二叉树构建成功"<<endl;
else
cerr<<"二叉树构建失败"<<endl;
cout<<"\n以树的形式输入二叉树"<<endl;
PrintTree(Tree,0);
cout<<"\n后续序列为:"<<endl;
Postorder (Tree);
cout<<"\n层序序列为:"<<endl;
Levelorder(Tree);
cout<<endl;
return 0;
}