由于题目中所说若某节点只有一个子结点,则此处将其看作左儿子结点,那么可以从先序遍历中确认出当前位是根节点那么下一位就是左子树的头。又由于后序遍历是左右中的遍历过程,也就是说先序遍历中左子树头在后序遍历里面是左子树的结果。通过这个性质可以完成左右子树的分隔。从而求出中序遍历。
一点小问题:在传递vactor的过程中要使用引用不然会超时。
vector<int> ans;
class Solution {
public:
void zhong(int l1, int r1, int l2, int r2, vector<int>& xian, vector<int>& hou) {
if (l1>r1) return ;
if (l1==r1) {
ans.push_back(xian[l1]);
return ;
}
int pos = -1;
for (int i = l2; i<=r2;i++) {
if (hou[i]==xian[l1+1]) {
pos = i;
}
}
//左子树
// if (r1>l1)
zhong(l1+1, l1+1+pos-l2, l2, pos, xian, hou);
// if (r1>=l1||r2>=l2)
ans.push_back(xian[l1]);
// printf("%c", xian[pos]);
//右子树
// if (r2>l2)
zhong(l1+pos-l2+2, r1, pos+1, r2-1, xian, hou);
}
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param n int 二叉树节点数量
* @param pre intvector 前序序列
* @param suf intvector 后序序列
* @return intvector
*/
vector<int> solve(int n, vector<int>& pre, vector<int>& suf) {
// write code here
zhong(0, n-1, 0, n-1, pre, suf);
return ans;
}
};

京公网安备 11010502036488号