标题:
从先序中序重建二叉树输出层序后序
时 限:
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);//后续遍历
}