https://ac.nowcoder.com/acm/contest/19859/O
关键:
1、传参(传左指针与右指针)在前序序列和后序序列里对应框定左子树右子树
2、需要中序遍历,所以递归调用代码顺序:先递归左子树,再输出该节点,再递归右子树
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param n int 二叉树节点数量
* @param pre intvector 前序序列
* @param suf intvector 后序序列
* @return intvector
*/
void dfs(int pl,int pr,int sl,int sr,vector<int>& pre, vector<int>& suf,vector<int>& ans){
if(pl==pr){
ans.push_back(pre[pl]);
return;
}
else if(pre[pl+1]==suf[sr-1]){
dfs(pl+1,pr,sl,sr-1,pre,suf,ans);
ans.push_back(pre[pl]);
return;
}
else{
int i;
for(i=sl;i<sr;i++){
if(suf[i]==pre[pl+1]){
break;
}
}
dfs(pl+1,pl+1+i-sl,sl,i,pre,suf,ans);//1
ans.push_back(pre[pl]);//1
dfs(pl+2+i-sl,pr,i+1,sr-1,pre,suf,ans);//1
return;
}
}
vector<int> solve(int n, vector<int>& pre, vector<int>& suf) {
vector<int> ans;
dfs(0,pre.size()-1,0,suf.size()-1,pre,suf,ans);
return ans;
}
};