浙大模拟(1)问题 C: 还原二叉树

    xiaoxiao2021-03-25  62

    题目描述

    给一棵二叉树的层序遍历序列和中序遍历序列,求这棵二叉树的先序遍历序列和后序遍历序列。

    输入

    每个输入文件中一组数据。

    第一行一个正整数N(1<=N<=30),代表二叉树的结点个数(结点编号为1~N)。接下来两行,每行N个正整数,分别代表二叉树的层序遍历序列和中序遍历序列。数据保证序列中1~N的每个数出现且只出现一次。

    输出

    输出两行,每行N个正整数,分别代表二叉树的先序遍历序列和后序遍历序列。每行末尾不输出额外的空格。

    样例输入

    7 3 5 4 2 6 7 1 2 5 3 6 4 7 1

    样例输出

    3 5 2 4 6 7 1 2 5 6 1 7 4 3 #include<stdio.h> #include<stdlib.h> using namespace std; int post[32]; int level[32]; int pre[32]; int in[32]; int n; typedef struct BiTNode{ int key; struct BiTNode *lchild; struct BiTNode *rchild; }BiTNode,*BiTree; BiTree creatTree(BiTree &T,int l,int r){ if(l>r) return NULL; int mid; bool flag = false; for(int i=1;i<=n;i++ ){ if(flag == false){ for(int j=l;j<=r;j++){ if(level[i]==in[j]){ mid = j; flag=true; break; } } } } T = (BiTree)malloc(sizeof(BiTNode)); T->key = in[mid]; // printf("mid=%d\n",mid); T->lchild = creatTree(T->lchild,l,mid-1); T->rchild = creatTree(T->rchild,mid+1,r); return T; } int flag; void preOrder(BiTree T){ if(T){ if(flag == false){ printf("%d",T->key); flag = true; } else{ printf(" %d",T->key); } preOrder(T->lchild); preOrder(T->rchild); } } void postOrder(BiTree T){ if(T){ postOrder(T->lchild); postOrder(T->rchild); if(flag == false){ printf("%d",T->key); flag = true; } else{ printf(" %d",T->key); } } } int main(){ while(scanf("%d",&n)!=EOF){ for(int i=1;i<=n;i++){ scanf("%d",&level[i]); } for(int i=1;i<=n;i++){ scanf("%d",&in[i]); } BiTree T ; T = creatTree(T,1,n); flag = false; preOrder(T); printf("\n"); flag = false; postOrder(T); } return 0; }
    转载请注明原文地址: https://ju.6miu.com/read-32751.html

    最新回复(0)