POJ 2255 Tree Recovery

  重建二叉树

  给定一棵二叉树的前序遍历和中序遍历的结果,求其后序遍历。

  输入输入可能有多组,以EOF结束。
  每组输入包含两个字符串,分别为树的前序遍历和中序遍历。每个字符串中只包含大写字母且互不重复。输出对于每组输入,用一行来输出它后序遍历结果。样例输入

  DBACEGF ABCDEFG
  BCAD CBAD

  样例输出

  ACBFGED
  CDAB


#include<stdio.h>
#include<iostream>
#include<string.h>
#define maxn 1001
using namespace std;
char s1[maxn],s2[maxn];
int fa=0,root,n1,n2,step=0,father[maxn],chilrd[maxn][2];
int search(int l,int r,char v)

 for(int i=l;i<=r;i++)
  if(s2[i]==v) return i;
 return -1;
}
void jianshu(int l,int r,int me)
{ if(me==-1) {step--;return;}
 chilrd[me][0]=search(l,me,s1[++step]);//printf("%d %d %d %d<-->%d\n",l,r,me,step,chilrd[me][0]);
 jianshu(l,me,chilrd[me][0]);
 chilrd[me][1]=search(me,r,s1[++step]);//printf("%d %d %d %d>-->%d\n",l,r,me,step,chilrd[me][1]);
 jianshu(me,r,chilrd[me][1]);
}
void dfs(int mt)

 for(int i=0;i<=1;i++)
  if(chilrd[mt][i]!=-1)
   dfs(chilrd[mt][i]);
 printf("%c",s2[mt]);
}
int main()
{
 while(scanf("%s %s",s1,s2)!=EOF)
 {
  n1=strlen(s1);n2=strlen(s2);
  root=search(0,n2-1,s1[0]);
  jianshu(0,n2-1,root);
  /*for(int i=0;i<n2;i++)
  {
   printf("%d    %d     %d\n",i,chilrd[i][0],chilrd[i][1]);
  }*/
  dfs(root);
  step=0;
  printf("\n");
 }
 return 0;
}

考查二叉树的遍历

思路:通过先序中序找出每个点的子节点,再递归后序输出

***:输入需要用EOF输入
posted @ 2019-11-26 23:04  Xcsj  阅读(120)  评论(0编辑  收藏  举报