#include <cstdio>
#include <string>
using namespace std;
string preOrder;
string inOrder;
string postOrder;
string getSubtreePostOrder(int pBegin, int pEnd, int iBegin, int iEnd) {
// printf("%d %d %d %d\n", pBegin, pEnd, iBegin, iEnd);
if (pBegin > pEnd && iBegin > iEnd) {
return "";
}
if (pBegin == pEnd && iBegin == iEnd) {
// printf("%c\n", preOrder[pBegin]);
return string(1, preOrder[pBegin]);
}
int root_pos_inOder = inOrder.find(preOrder[pBegin], iBegin);
int leftTreeSize = root_pos_inOder - iBegin;
int rightTreeSize = iEnd - root_pos_inOder;
string returnString = getSubtreePostOrder(pBegin + 1, pBegin + leftTreeSize, root_pos_inOder - leftTreeSize, root_pos_inOder - 1);
returnString += getSubtreePostOrder(pBegin + leftTreeSize + 1, pEnd, root_pos_inOder + 1, root_pos_inOder + rightTreeSize);
returnString += string(1, preOrder[pBegin]);
// printf("%s\n", returnString.c_str());
return returnString;
}
void getPostOrder() {
postOrder = "";
postOrder = getSubtreePostOrder(0, preOrder.size() - 1, 0, inOrder.size() - 1);
postOrder += string(1, '\0');
printf("%s\n", postOrder.c_str());
}
int main() {
while(1) {
char pOrder[27] = {0};
char iOrder[27] = {0};
scanf("%s", pOrder);
if (pOrder[0] == '\0') {
break;
}
scanf("%s", iOrder);
preOrder = pOrder;
inOrder = iOrder;
getPostOrder();
}
}
#include <string>
using namespace std;
string preOrder;
string inOrder;
string postOrder;
string getSubtreePostOrder(int pBegin, int pEnd, int iBegin, int iEnd) {
// printf("%d %d %d %d\n", pBegin, pEnd, iBegin, iEnd);
if (pBegin > pEnd && iBegin > iEnd) {
return "";
}
if (pBegin == pEnd && iBegin == iEnd) {
// printf("%c\n", preOrder[pBegin]);
return string(1, preOrder[pBegin]);
}
int root_pos_inOder = inOrder.find(preOrder[pBegin], iBegin);
int leftTreeSize = root_pos_inOder - iBegin;
int rightTreeSize = iEnd - root_pos_inOder;
string returnString = getSubtreePostOrder(pBegin + 1, pBegin + leftTreeSize, root_pos_inOder - leftTreeSize, root_pos_inOder - 1);
returnString += getSubtreePostOrder(pBegin + leftTreeSize + 1, pEnd, root_pos_inOder + 1, root_pos_inOder + rightTreeSize);
returnString += string(1, preOrder[pBegin]);
// printf("%s\n", returnString.c_str());
return returnString;
}
void getPostOrder() {
postOrder = "";
postOrder = getSubtreePostOrder(0, preOrder.size() - 1, 0, inOrder.size() - 1);
postOrder += string(1, '\0');
printf("%s\n", postOrder.c_str());
}
int main() {
while(1) {
char pOrder[27] = {0};
char iOrder[27] = {0};
scanf("%s", pOrder);
if (pOrder[0] == '\0') {
break;
}
scanf("%s", iOrder);
preOrder = pOrder;
inOrder = iOrder;
getPostOrder();
}
}
典型的递归题, 不过感觉自己递归编程还有欠缺,脑海中大致知道如何,
但是实现时就又会发现遗漏。
大致递归等于是每次传入的参数(环境上下文)不同来完成新递归场景的处理,然后返回处理结果。还是要多练和总结.
这种题还考察字符串的截取和划分能力,要想清楚,不然容易+/-1个字符.
纰漏:
1. 竟然忘了string不能直接 += char, 而要用string(n, char)这种方式, STL虽然看了很多书,还是不够熟练.
2. 把二叉树没有分支的给漏了。还是一个思考全面性的问题.
3. 老出Output Limit Exceeded,后来清楚是因为scanf一直循环,没有结束引起的,题目说结束标志是end of file, 原来写的是scanf("%s %s\n", &a, &b),
不行,就改了。
code都是draft级的, AC就不再优化整理了.
STL 确实在这类操作字符串的题中还是很有用的.