#include <cstdlib>
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
/*
Author: YuXun Lu
Time:23rd/2/2012
Last Time:About 7 Hours
Begin Time:Unknown
End Time:Unknown
Test Data:
ABDKQOPENLMCFIGHJ QKPODBNEMLACIFGJH
输出:
随便找一个AC过得程序测一下就好
思路:
以前序遍历的第一个元素将中序遍历的数组分成两个部分
[0..root)和(root,len-1]
有一个当前指针p,从1开始一直到len1-1遍历前序数组。
p指向当前在中序遍历搜索的元素。
有一个node数组,保存左右儿子的下标、自己的val在中序遍历数组
中的位置还有一个val
Search_Left(int begin,int end,char val)
t = search(begin,end,val) //在中序数组里搜索当前要搜索的节点
if( t != -1 ) 找到了
{
nodes[end].l = t;
p++
//搜索找到的这个节点的左、右儿子,注意,
Search_Left的end是父节点的位置,
Search_Right的begin是父节点的位置
Search_Left(begin,nodes[t].pos,buf1[p]);
Search_Right(nodes[t].pos,end,buf1[p]);
}
Search_Right(int begin,int end,char val)
{
t = Search(begin,end,val)
if ( t != -1)
{
nodes[begin].r = t;
p++;
search_left(begin,nodes[t].pos,buf1[p]);
search_right(nodes[t].pos,end,buf1[p]);
}
}
注意,必须先搜左边的再搜右边的
因为每次搜索的区间都不一样,最好自己构建一棵树写一下这个
过程,区间的两个端点是有继承性的。
*/
const int MAX_SIZE = 1000;
struct node
{
int l; // the index of node in node
int r;
char val;
int pos;
};
char buf1[MAX_SIZE];
char buf2[MAX_SIZE];
int len1 = 0 ,len2 = 0,p;
node nodes[MAX_SIZE];
void left_search(int begin,int end,char val);
void right_search(int begin,int end,char val);
int search(int begin,int end,char val);
void DFS(node now)
{
if(now.l != -1)
DFS(nodes[now.l]);
if(now.r != -1)
DFS(nodes[now.r]);
printf("%c",now.val);
}
int search1(int begin,int end,char val)
{
int res = -1;
for(int i = begin;i < end; i++)
{
if ( val == buf1[i])
res = i;
}
return res;
}
void left_search(int begin,int end,char val)
{
int t;
if(begin >= end)
return;
#ifdef DBG
printf("Search left son for %c\n",nodes[end].val);
#endif
t = search(begin,end,val);
if( t != -1)
{
///找到了
#ifdef DBG
printf("Gotted!Val is %c\n",buf2[t]);
#endif
nodes[end].l = t;
p++; ///找下一个元素
left_search(begin,nodes[t].pos,buf1[p]);
right_search(nodes[t].pos,end,buf1[p]);
}
}
void right_search(int begin,int end,char val)
{
int t;
if(begin >= end)
return;
#ifdef DBG
printf("Search right son for %c\n",nodes[begin].val);
#endif
t = search(begin,end,val);
if( t != -1)
{
#ifdef DBG
printf("Gotted!The val is %c\n",buf2[t]);
#endif
nodes[begin].r = t;
p++;
// right_search(nodes[t].pos,end,buf1[p]);
left_search(begin,nodes[t].pos,buf1[p]);
right_search(nodes[t].pos,end,buf1[p]);
}
}
int search(int begin,int end,char val)
{
int res = -1;
for(int i = begin; i < end; i++)
{
if(buf2[i] == val)
{
res = i;break;
}
}
return res;
}
int main(int argc,char* argv[])
{
#ifdef INPUT
freopen("B:\\acm\\poj2255-Tree Recovery\\input.txt","r",stdin);
#endif
while(scanf("%s",buf1) != EOF)
{
int root = 0;
memset(nodes,0,sizeof(node)*MAX_SIZE);
p = 0;
scanf("%s",buf2);
len1 =strlen(buf1);len2 = strlen(buf2);
for(int i = 0 ; i < len1 ; i++)
{
nodes[i].val = buf2[i];
nodes[i].l = -1;
nodes[i].r = -1;
nodes[i].pos = i;
}
root = search(0,len2,buf1[0]);
p = 1;
left_search(0,root,buf1[p]);
right_search(root,len2,buf1[p]);
DFS(nodes[root]);
memset(buf1,0,sizeof(char)*MAX_SIZE);
memset(buf2,0,sizeof(char)*MAX_SIZE);
printf("\n");
}
return 0;
}
【POJ2255】Tree Recovery解题报告 思路 + 数据 +代码
最新推荐文章于 2020-01-19 15:03:54 发布