前序遍历的顺序是根左右,我们可以确定数组中的第一个元素就是根节点,根节点后面的元素是左子树还是右子树呢,我们并不清楚,但是题目上说了,如果某个节点只有一个子节点那么这个子节点就是左节点,所以我们就确定了,根节点后面的节点就一定是左子树的节点。既然左子树的节点确定了,我们就在后序遍历中找到这个节点,区分左子树和右子树,进而就可以求出来中序遍历结果了。

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param n int 二叉树节点数量
     * @param pre intvector 前序序列
     * @param suf intvector 后序序列
     * @return intvector
     */
    vector<int>res;
    void deal(vector<int>& pre, vector<int>& suf, int l1, int r1, int l2, int r2) {
        if (l1 > r1)return;
        if (l1 == r1) {
            res.push_back(pre[l1]);
            return;
        }
        int pos = 0;
        for (int i = l2; i <= r2; i++) {
            if (suf[i] == pre[l1 + 1]) {
                pos = i;
                break;
            }
        }
        deal(pre, suf, l1 + 1, l1 + 1 + pos - l2, l2, pos);
        res.push_back(pre[l1]);
        deal(pre, suf, l1 + 1 + pos - l2 + 1, r1, pos + 1, r2 - 1);
    }
    vector<int> solve(int n, vector<int>& pre, vector<int>& suf) {
        // write code here
        deal(pre, suf, 0, n - 1, 0, n - 1);
        return res;
    }
};