剣指offer--二叉木を再建(c++)


タイトルの説明
ツリーの前順および中順の結果を入力し、ツリーを再構築します.注意:ツリーの各ノードの値は互いに異なります.入力した前序遍歴と中序遍歴は一定の合法である.サンプル所与:前シーケンスループ:[3,9,20,15,7]中シーケンスループ:[9,3,15,20,7]戻り:[3,9,20,null,null,15,7,null,null,null,null,null]
構想
配列内の最初の数がルートノードの値であることを順に遍歴し、中順遍歴した配列からこの値の位置を見つけると、左の数が左サブツリーの要素であり、右の数が右サブツリーの要素であり、それぞれ左サブツリーと右サブツリーが再帰される.
class Solution {
public:
    TreeNode* buildTree(vector<int> pre, vector<int> in) {
        if(pre.size() == 0 || pre.size() != in.size()){
            return nullptr;
        }
        int value = pre[0];
        TreeNode* root = new TreeNode(value);
        if(pre.size() == 1){
            return root;
        }
        //               
        auto pos = find(in.begin(), in.end(), value);
        //     ,   NULL
        if(pos == in.end()){
            return nullptr;
        }
        int leftSize = pos - in.begin();
        int rightSize = in.end() - pos - 1;
        root->left = buildTree(vector<int>(pre.begin() + 1, pre.begin() + 1 + leftSize), 
                                           vector<int>(in.begin(), in.begin() + leftSize));
        root->right = buildTree(vector<int>(pre.begin() + 1 + leftSize, pre.end()), 
                                            vector<int>(in.begin() + leftSize + 1, in.end()));
        return root;   
    }
};