标题:
|
从先序中序重建二叉树输出层序后序
|
时 限:
|
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>
struct NODE
{
struct NODE *pLeft;
struct NODE *pRight;
int data;
}BitNode;
void ReBuild(int* pPreOrder, int* pInOrder, int nTreeLen, struct NODE** pRoot)
{
struct NODE *pTemp;
int* pOrgInOrder=pInOrder;
int* pLeftEnd=pInOrder;
int nTempLen=0;
int nLeftLen=0;
int nRightLen=0;
pTemp=malloc(sizeof(struct NODE));
if(pPreOrder==NULL||pInOrder==NULL)
return;
//获得前序遍历的第一个节点
pTemp->data=*pPreOrder;
pTemp->pLeft=NULL;
pTemp->pRight=NULL;
if(*pRoot==NULL)//如果节点为空,当前节点则为根节点
*pRoot=pTemp;
if(nTreeLen==1)//如果树的长度为1,已到最后一个节点了
return;
//找到左子树的结尾
while(*pPreOrder!=*pLeftEnd){
if(pPreOrder==NULL||pLeftEnd==NULL)
return ;
nTempLen++;
//记录临时长度,以免溢出
if(nTempLen>nTreeLen)
break;
pLeftEnd++;
}
nLeftLen=(int)(pLeftEnd-pOrgInOrder);
nRightLen=nTreeLen-nLeftLen-1;
if(nLeftLen>0)
ReBuild(pPreOrder+1,pInOrder,nLeftLen,&((*pRoot)->pLeft));
//重建右子树
if(nRightLen>0)
ReBuild(pPreOrder+nLeftLen+1,pInOrder+nLeftLen+1,nRightLen,&((*pRoot)->pRight));
}
void Postorder(struct NODE *root)
{
if(root!=NULL)
{
Postorder(root->pLeft);
Postorder(root->pRight);
printf("%d ",root->data);
}
}
void LevalOrder(struct NODE *root)
{
int front=0,rear=1;
struct NODE *q[9999];
q[0]=root;
/* int front=0,rear=1;*/
while(front<rear)
{
if(q[front])
{
printf("%d ",q[front]->data);
q[rear++]=q[front]->pLeft;
q[rear++]=q[front]->pRight;
front++;
}
else
{
front++;
}
}
}
int main()
{
int *szPreOrder,*szInOrder;
int m_treelength,i;
struct NODE* pRoot=NULL;
scanf("%d",&m_treelength);
szPreOrder=(int*)malloc(m_treelength*sizeof(int));
szInOrder=(int*)malloc(m_treelength*sizeof(int));
for (i=0;i<m_treelength;i++)
{
scanf("%d",&szPreOrder[i]);
}
for (i=0;i<m_treelength;i++)
{
scanf("%d",&szInOrder[i]);
}
ReBuild(szPreOrder,szInOrder,m_treelength,&pRoot);
LevalOrder(pRoot);//层序遍历
printf("\n");
Postorder(pRoot);//后续遍历
}