标签:
Description
Input
Output
Sample Input
BADC
BDCA
Sample Output
ABCD
思路
我们知道,前序遍历(PreOrder):根节点->左子树->右子树;中序遍历(InOrder):左子树->根节点->右子树;(PostOrder)后序遍历:左子树->右子数->根节点。故PostOrder的最后一个数为树根。由PostOrder找出树根后,可根据InOrder中分出树根的左右子树。InOrder中,树根左边为其左子树,右边为右子树。例如样例中:
in : BADC
post:BDCA
左子树为B,右子树为DC;在InOrder中找根的位置pos;
则左子树中序序列为In.substr(0,pos),后序序列为Post.substr(0,pos)
右子树的先序序列为In.subst(pos+1,len-pos-1),后序序列为post.substr(pos,len-pos-1)
通过递归不断重复以后步骤,当串为空时退出
#include<bits/stdc++.h>
using namespace std;
string in,post;
void pre(string in,string post)
{
if (post.empty()) return;
int pos,len = post.size();
char ch = post[len-1];
cout << ch;
pos = in.find(ch);
pre(in.substr(0,pos),post.substr(0,pos));
pre(in.substr(pos + 1,len - pos - 1),post.substr(pos,len - pos - 1));
}
int main()
{
cin >> in >> post;
pre(in,post);
return 0;
}
#include<bits/stdc++.h>
using namespace std;
const int maxn = 15;
void pre(int N,char a[],char b[])
{
if (N <= 0) return;
int pos;
for (int i = 0;i < N;i++)
if (a[i] == b[N-1]) pos = i;
printf("%c",b[N-1]);
pre(pos,a,b);
pre(N - pos - 1,a + pos + 1,b + pos);
}
int main()
{
char a[maxn],b[maxn];
scanf("%s %s",a,b);
int len = strlen(a);
pre(len,a,b);
return 0;
}
标签:
原文地址:http://www.cnblogs.com/zzy19961112/p/5939873.html