POJ 2255 Tree Recovery

早过忘川 提交于 2019-12-05 18:08:40

  重建二叉树

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

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

  DBACEGF ABCDEFG
  BCAD CBAD

  样例输出

  ACBFGED
  CDAB#include<stdio.h>#include<iostream>#include<string.h>#define maxn 1001using 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输入
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!