标题:从先序中序重建二叉树输出层序后序
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 <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” 博客,转载请与作者联系!
相关文章推荐
- 从先序中序重建二叉树输出层序后序
- 从层序中序重建二叉树输出先序后序
- 层序输出二叉树
- 根据前中后序和层序重建二叉树(PAT1020、PAT1043)
- 剑指offer 01-06解答思路以及代码(顺序数组找特定数字,替换空格字符,链表反转输出,重建二叉树,两个栈实现队列效果,旋转数组最小元素)
- LeetCode二叉树的层序遍历的输出
- 括号法递归建立二叉树并层序遍历输出
- 队列 树(层序输出二叉树)
- PAT-A1099. 二叉树-中序建树 层序输出
- 给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。
- 层序输出二叉树:
- 数据结构之二叉树1(前序中序后序层序遍历,重建二叉树)
- 通过前序遍历和中序遍历重建二叉树以及输出后序遍历(Java实现)(二)
- Java实现由前序序列和中序序列重建二叉树,并后序输出。
- 根据前中后序和层序重建二叉树(PAT1020、PAT1043)
- 序列节点根据前中后序和层序重建二叉树(PAT1020、PAT1043)
- PAT-A1102. 二叉树-翻转 层序、中序输出
- 重建二叉树——输入前序、中序遍历构建二叉树并输出后序遍历
- 重建二叉树 的 非递归算法(已知前序和中序)输出 层续和后续
- 先序和中序重建二叉树 后序输出