先重构二叉树,后层次遍历。

class Solution {
public:
    unordered_map<int, int> index;
    TreeNode* rebuild(vector<int>& pre, int pre_left, int pre_right,vector<int>& in, int in_left, int in_right)
    {
        if (pre_left > pre_right)
            return nullptr;
        int root_val = pre[pre_left];
        int in_root = index[root_val];
        TreeNode* root = new TreeNode(root_val);
        int size_left_subtree = in_root - in_left;
        root->left = rebuild(pre, pre_left + 1, pre_left + size_left_subtree, in, in_left, in_root - 1);
        root->right = rebuild(pre, pre_left + size_left_subtree + 1, pre_right, in, in_root + 1, in_right);
        return root;
    }

    vector<int> solve(vector<int>& xianxu, vector<int>& zhongxu) {
        int n = xianxu.size();
        vector<int> vec;
        if(n == 0) return vec;
        for (int i = 0; i < n; i++)
            index[zhongxu[i]] = i;
        TreeNode* root = rebuild(xianxu, 0, n - 1, zhongxu, 0, n - 1);
        queue<TreeNode*> que;
        que.push(root);
        while(!que.empty())
        {
            int len = que.size();
            for(int i = 0; i < len; i++)
            {
                if(i == len - 1)
                    vec.push_back(que.front()->val);
                if(que.front()->left != nullptr) que.push(que.front()->left);
                if(que.front()->right != nullptr) que.push(que.front()->right);
                que.pop();
            }
        }
        return vec;
    }
};