从先序中序重建二叉树输出层序后序
实验题目(共6题, 第2题)
| 标题: | 从先序中序重建二叉树输出层序后序 |
| 时 限: | 5000 ms |
| 内存限制: | 20000 K |
| 总时限: | 10000 ms |
| 描述: |
由树的先序和中序遍历生成树的层序遍历后序遍历
给定一个树的先序和中序的遍历结果,构建一棵树,并输出这个棵树的层序遍历和后序遍历结果
注:这棵树的结点是由整数描述 |
| 输入: |
树结点总数m
先序输出序列
中序输出序列 |
| 输出: |
层序输出序列
后续输出序列 |
| 输入样例: |
10
1 2 5 10 3 6 13 7 14 15
2 10 5 1 6 13 3 14 7 15 |
| 输出样例: |
1 2 3 5 6 7 10 13 14 15
10 5 2 13 6 14 15 7 3 1 |
| 提示: |
先序遍历的第一个输出是根结点 |
|
来源: #include<stdio.h>
#include<stdlib.h>
#define STACK_INIT_SIZE 100 // 存储空间初始分配量
#define STACKINCREMENT 10 // 存储空间分配增量
int *pre;
int *in;
typedef struct BiTNode
{
int data;
struct BiTNode *lchild;
struct BiTNode *rchild;
}BiTNode,*BiTree;
struct SqStack
{
BiTree *base; // 在栈构造之前和销毁之后,base的值为NULL
BiTree *top; // 栈顶指针
int stacksize; // 当前已分配的存储空间,以元素为单位
}; // 顺序栈
typedef struct QNode
{
BiTree data;
QNode *next;
}*QueuePtr;
struct LinkQueue
{
QueuePtr front,rear; // 队头、队尾指针
};
void LevelOrderTraverse(BiTree T);
void PostOrderTraverseNonRecursive(BiTree T);
void InitStack(SqStack &S);
void Pop(SqStack &S,BiTree &e);
void Push(SqStack &S,BiTree e);
int GetTop(SqStack S,BiTree &e);
int StackEmpty(SqStack S);
void DeQueue(LinkQueue &Q,BiTree &e);
void EnQueue(LinkQueue &Q,BiTree e);
int QueueEmpty(LinkQueue Q);
void InitQueue(LinkQueue &Q);
BiTree restore(int *pre,int *in,int n);
int main()
{
BiTree T;
int n,i;
scanf("%d",&n);
pre=(int *)malloc(n*sizeof(int));
in=(int *)malloc(n*sizeof(int ));
for(i=0;i<n;i++)
{
scanf("%d",pre+i);
}
for(i=0;i<n;i++)
{
scanf("%d",in+i);
}
T=restore(pre,in,n);
LevelOrderTraverse(T);
printf("\n");
PostOrderTraverseNonRecursive(T);
free(pre);
free(in);
return 0;
}
BiTree restore(int *pre,int *in,int n)
{
if(n==0) return 0;
BiTree p;
int *rpos;
int k;
p=(BiTree)malloc(sizeof(BiTNode));
if(!p)
{
printf("out of space!\n");
exit(0);
}
p->data=*pre;
for(rpos=in;rpos<in+n;rpos++)
{
if(*rpos==*pre) break;
}
k=rpos-in;
p->lchild=restore(pre+1,in,k);
p->rchild=restore(pre+1+k,rpos+1,n-1-k);
return p;
}
void LevelOrderTraverse(BiTree T)
{
LinkQueue q;
BiTree a;
if(T)
{
InitQueue(q);
EnQueue(q,T);
while(!QueueEmpty(q))
{
DeQueue(q,a);
printf("%d ",a->data);
if(a->lchild!=NULL)
EnQueue(q,a->lchild);
if(a->rchild!=NULL)
EnQueue(q,a->rchild);
}
}
}
void PostOrderTraverseNonRecursive(BiTree T)
{
BiTree p;
if(T==NULL) return;
SqStack S1, S2;
InitStack(S1);
InitStack(S2);
Push(S1, T);
while (!StackEmpty(S1))
{
Pop(S1, p);
Push(S2, p);
if (p->lchild != NULL) Push(S1, p->lchild);
if (p->rchild != NULL) Push(S1, p->rchild);
}
while (!StackEmpty(S2))
{
Pop(S2, p);
printf("%d ",p->data);
}
}
void InitStack(SqStack &S)
{
// 构造一个空栈S
if(!(S.base=(BiTree *)malloc(STACK_INIT_SIZE*sizeof(BiTree))))
exit(0); // 存储分配失败
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
}
int StackEmpty(SqStack S)
{
// 若栈S为空栈,则返回1,否则返回0
if(S.top==S.base)
return 1;
else
return 0;
}
int GetTop(SqStack S,BiTree &e)
{
// 若栈不空,则用e返回S的栈顶元素,并返回1;否则返回-1
if(S.top>S.base)
{
e=*(S.top-1);
return 1;
}
else
return 0;
}
void Push(SqStack &S,BiTree e)
{
// 插入元素e为新的栈顶元素
if(S.top-S.base>=S.stacksize) // 栈满,追加存储空间
{
S.base=(BiTree *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(BiTree));
if(!S.base)
exit(0); // 存储分配失败
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*(S.top)++=e;
}
void Pop(SqStack &S,BiTree &e)
{
// 若栈不空,则删除S的栈顶元素,用e返回其值,并返回1;否则返回-1
if(S.top==S.base)
exit(0);
e=*--S.top;
}
void InitQueue(LinkQueue &Q)
{
// 构造一个空队列Q
if(!(Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode))))
exit(0);
Q.front->next=NULL;
}
int QueueEmpty(LinkQueue Q)
{
// 若Q为空队列,则返回TRUE,否则返回FALSE
if(Q.front==Q.rear)
return 1;
else
return 0;
}
void EnQueue(LinkQueue &Q,BiTree e)
{
// 插入元素e为Q的新的队尾元素
QueuePtr p;
if(!(p=(QueuePtr)malloc(sizeof(QNode)))) // 存储分配失败
exit(0);
p->data=e;
p->next=NULL;
Q.rear->next=p;
Q.rear=p;
}
void DeQueue(LinkQueue &Q,BiTree &e)
{
// 若队列不空,删除Q的队头元素,用e返回其值,并返回1,否则返回0
QueuePtr p;
if(Q.front==Q.rear)
exit(0);
p=Q.front->next;
e=p->data;
Q.front->next=p->next;
if(Q.rear==p) Q.rear=Q.front;
free(p);
}
|

浙公网安备 33010602011771号