输入二叉树的前序,输出二叉树的中序,后序,层次。
空的用#代替。
代码实现:
#include <iostream>
#include <malloc.h>
using namespace std;
typedef struct node
{
struct node *lChild,*rChild;
char data;
} BiTreeNode,*BiTree;
void createBiTree(BiTree &T)
{
char ch;
cin>>ch;
if(ch-'#'==0)
{
T=NULL;
return;
}
else
{
T=new BiTreeNode;
T->data=ch;
createBiTree(T->lChild);
createBiTree(T->rChild);
}
}
void preTraverse(BiTree T)
{
if(T)
{
cout<<T->data<<" ";
preTraverse(T->lChild);
preTraverse(T->rChild);
}
}
void midTraverse(BiTree T)
{
if(T)
{
midTraverse(T->lChild);
cout<<T->data<<" ";
midTraverse(T->rChild);
}
}
void postTraverse(BiTree T)
{
if(T)
{
postTraverse(T->lChild);
postTraverse(T->rChild);
cout <<T->data<< " ";
}
}
typedef struct qnode
{
BiTree da;
struct qnode *next;
} QNode;
typedef struct
{
QNode *f;
QNode *r;
} LiQueue;
void QueueInit(LiQueue *&q)
{
q=(LiQueue*)malloc(sizeof(LiQueue));
q->f=q->r=NULL;
}
void QueuePush(LiQueue *&q,BiTree e)
{
QNode *p;
p=(QNode*)malloc(sizeof(QNode));
p->da=e;
p->next=NULL;
if(q->f==q->r&&q->f==NULL)
q->f=q->r=p;
else
{
q->r->next=p;
q->r=p;
}
}
BiTree QueueFront(LiQueue *&q)
{
QNode *t;
BiTree x;
t=q->f;
x=t->da;
q->f=t->next;
if(q->r==t)
q->r=NULL;
free(t);
return x;
}
void LevelTraverse(BiTree root)
{
LiQueue *q;
QueueInit(q);
QueuePush(q, root);
while(q->f!=NULL)
{
BiTree front=QueueFront(q);
cout<<front->data<<" ";
if (front->lChild)
QueuePush(q, front->lChild);
if (front->rChild)
QueuePush(q, front->rChild);
}
}
int main()
{
BiTree T;
createBiTree(T);
cout<<"preTraverse:"<<endl;
preTraverse(T);
cout<<endl;
cout<<"midTraverse:"<<endl;
midTraverse(T);
cout<<endl;
cout<<"postTraverse:"<<endl;
postTraverse(T);
cout<<endl;
cout<<"LevelTraverse:"<<endl;
LevelTraverse(T);
cout<<endl;
return 0;
}
样例输入
124#7###358##9##6##
样例输出
preTraverse:
1 2 4 7 3 5 8 9 6
midTraverse:
4 7 2 1 8 5 9 3 6
postTraverse:
7 4 2 8 9 5 6 3 1
LevelTraverse:
1 2 3 4 5 6 7 8 9