您的位置:首页 > 其它

标题:从先序中序重建二叉树输出层序后序

2011-05-20 21:59 176 查看
[align=right]标题:[/align]
[align=left]从先序中序重建二叉树输出层序后序[/align]
[align=right]时 限:[/align]
[align=left]5000 ms[/align]
[align=right]内存限制:[/align]
[align=left]20000 K[/align]
[align=right]总时限:[/align]
[align=left]10000 ms[/align]
[align=right]描述:[/align]
[align=left]由树的先序和中序遍历生成树的层序遍历后序遍历[/align]
[align=left]给定一个树的先序和中序的遍历结果,构建一棵树,并输出这个棵树的层序遍历和后序遍历结果[/align]
[align=left]注:这棵树的结点是由整数描述[/align]
[align=right]输入:[/align]
[align=left]树结点总数m[/align]
[align=left]先序输出序列[/align]
[align=left]中序输出序列[/align]
[align=right]输出:[/align]
[align=left]层序输出序列[/align]
[align=left]后续输出序列[/align]
[align=right]输入样例:[/align]
[align=left]10[/align]
[align=left]1 2 5 10 3 6 13 7 14 15[/align]
[align=left]2 10 5 1 6 13 3 14 7 15[/align]
[align=right]输出样例:[/align]
[align=left]1 2 3 5 6 7 10 13 14 15[/align]
[align=left]10 5 2 13 6 14 15 7 3 1[/align]
[align=right]提示:[/align]
[align=left]先序遍历的第一个输出是根结点[/align]
[align=right]来源:[/align]
[align=left] [/align]
#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);//后续遍历

}

本文出自 “維納斯のτéār” 博客,转载请与作者联系!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: