赞
踩
给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。
输入格式:
输入第一行给出一个正整数N(≤30),是二叉树中结点的个数。第二行给出其后序遍历序列。第三行给出其中序遍历序列。数字间以空格分隔。
输出格式:
在一行中输出该树的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。
输入样例:
7
2 3 1 5 7 6 4
1 2 3 4 5 6 7
输出样例:
4 1 6 3 5 7 2
题目解答:
#include<stdio.h> #include<string.h> #include<stdlib.h> int n; int hou[60],in[60]; typedef struct TNode *Position; typedef Position BinTree; struct TNode{ char Data; BinTree Left; BinTree Right; }; BinTree restoreTree(int hou[],int in[],int n){//还原二叉树 int i; int lhou[100],rhou[100]; int lin[100],rin[100]; int n1=0,n2=0;//n1为后序遍历中左子树的个数,n2为右子树的个数。 int m1=0,m2=0;//m1为中序遍历中左子树的个数,m2为中序遍历中右子树的个数。 if(n==0) return NULL; BinTree T=(BinTree)malloc(sizeof(struct TNode)); if(T==NULL) return NULL; T->Data=hou[n-1];//后序遍历中的最后一个数一定为根节点 //下边就根据根节点把中序遍历分为左右子树,记录长度,再根据这一个长度把后序遍历分左右子树,在确定下一个根节点 //通过递归实现 //分中序序列; for(i=0;i<n;i++) { if(i<=n1&&in[i]!=hou[n-1]) { lin[n1]=in[i]; n1++; } else if(in[i]!=hou[n-1]) { rin[n2]=in[i]; n2++; } } //分后续序列 for(i=0;i<n-1;i++) { if(i<n1) { lhou[m1]=hou[i]; m1++; } else{ rhou[m2]=hou[i]; m2++; } } //通过递归确定左子树下一个根节点 ,右子树的下一个节点。 T->Left=restoreTree(lhou,lin,n1); T->Right=restoreTree(rhou,rin,n2); return T; } void LevelorderTraversal( BinTree BT,int n ) { int count=0; if(!BT) return ; BinTree a[10000]; a[0]=BT; int len=1; int i; while(1){ if(len==0) break; int pos=0; BinTree b[10000]; for(i=0;i<len;i++) { if(a[i]!=NULL) printf("%d",a[i]->Data); count++; if(count!=n) printf(" "); if(a[i]->Left!=NULL) b[pos++]=a[i]->Left; if(a[i]->Right!=NULL) b[pos++]=a[i]->Right; } len=pos; for(i=0;i<len;i++) a[i]=b[i]; } } int main() { int i,j; scanf("%d",&n); for(i=0;i<n;i++) scanf("%d",&hou[i]); for(j=0;j<n;j++) scanf("%d",&in[j]); BinTree T=NULL; T=restoreTree(hou,in,n); LevelorderTraversal(T,n); return 0; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。