解析:通过递归的方法从树根向下依次构造一颗二叉树,然后通过层次遍历该树。所以根据中序和任意一个其他序列构造一颗二叉树的方法只需掌握一种,便可以推出另外一种的写法。
AC代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct node{
int data;
struct node *left;
struct node *right;
}*BiTree;
BiTree createTreeByInorderAndPostOrder(int ino[],int post[],int len);
void levelTraversal(BiTree T);
int main(){
int n,i;
scanf("%d",&n);
int ino[n];
int post[n];
for(i=0;i<n;i++){
scanf("%d",&post[i]);
}
for(i=0;i<n;i++){
scanf("%d",&ino[i]);
}
BiTree T = createTreeByInorderAndPostOrder(ino,post,n);
levelTraversal(T);
return 0;
}
BiTree createTreeByInorderAndPostOrder(int ino[],int post[],int len){
if(len==0){
return NULL;
}
int i=0;
while(ino[i]!=post[len-1]){
i++;
}
int leftNum = i;
int rightNum = len-i-1;
BiTree T = (BiTree)malloc(sizeof(struct node));
T->data = ino[i]; //老是搞忘这一步
T->left = createTreeByInorderAndPostOrder(&ino[0],&post[0],leftNum); //首地址记得加取地址符
T->right = createTreeByInorderAndPostOrder(&ino[leftNum+1],&post[leftNum],rightNum);
return T;
}
void levelTraversal(BiTree T){
BiTree Queue[31];
int front = -1,rear = -1;
int count=0;
Queue[++rear] = T;//入队
while(rear>front){
BiTree q = Queue[++front];
if(count==0){
printf("%d",q->data);
count++;
}else{
printf(" %d",q->data);
}
if(q->left){
Queue[++rear] = q->left;
}
if(q->right){
Queue[++rear] = q->right;
}
}
return;
}
附上结果图