这道题是我面试360的一道面试题,本来面试官的意思估计是让我按照上篇中所说的从前序和中序求出一棵树,但后来估计被我引导错了,这是我自己给自己挖坑啊,不过其实如果会做从前序和中序求出树的话,这道题其实也不难了。
这道题假设所有的遍历序列都是以字符串存储的,所以需要从前序和中序字符串求出后序字符串。这道题当然可以先求出树然后再进行后序遍历。不过也可以不建树而直接求后序字符串。思路是从先序中找到根,并将根插入后序串的末尾,然后从中序中找出左右子树,因为后序遍历的顺序是左右根,所以接下来需要先递归遍历右子树,再递归遍历左子树,这样在递归遍历结束时就可以从后往前生成后序遍历序列。
class Solution{
public:
string postOrder(string preOrder,string inOrder){
string result;
if(preOrder.empty() || inOrder.empty()){
return result;
}
post(preOrder,inOrder,result);
return result;
}
void post(string preOrder,string inOrder,string &postOrder){
if(preOrder.empty() || inOrder.empty())
return;
string curStr = preOrder.substr(0,1);
if(postOrder.empty())
postOrder = curStr;
else
postOrder.insert(0,curStr);
int i = inOrder.find(curStr);
string leftIn = inOrder.substr(0,i);
string rightIn = inOrder.substr(i + 1);
string leftPre = preOrder.substr(1,leftIn.length());
string rightPre = preOrder.substr(leftIn.length() + 1);
post(rightPre,rightIn,postOrder);
post(leftPre,leftIn,postOrder);
}
};
这道题当时在面试时也是做的一塌糊涂,首先是对C++string的判空不能用NULL,这些常识性错误肯定会给面试官留下不好的印象,确实需要注意一些C++与java的不同之处,抓基础啊抓基础!!!