leetcode 105. 前順と中順にシーケンスを遍歴して二叉木を構築する【再帰的に二叉木を構築し、以下を伝達対象とする】c++


実行時間:20 ms、すべてのC++コミットで99.54%のユーザーを破った
メモリ消費量:16.4 MB、すべてのC++コミットで91.80%のユーザーを破った
1本の木の前順遍歴と中順遍歴に基づいて二叉樹を構築する.
注意:ツリーに重複する要素がないと仮定できます.
たとえば、
プリアンブル遍歴preorder=[3,9,20,15,7]のシーケンス遍歴inorder=[9,3,15,20,7]は、次のツリーを返します.
    3    /\  9  20    / \   15   7
 
さいきこうぞうツリー
パラメータの伝達を減らすために、余分なパラメータの定義をできるだけ避けます(これは雑然と見えますが).
パラメータは次のとおりです.
int pre 1:前順遍歴数列の始点
int pre 2:前順遍歴数列の終点
int in 1:中順遍歴数列の始点
int in 2:中順遍歴数列の終点
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    TreeNode* buildTree(vector& preorder, vector& inorder) {
        //    
        //  :   
        //  :   
        //             。
        if(preorder.size()==0) return NULL;
        return getroot(preorder,inorder,0,preorder.size()-1,0,inorder.size()-1);
    }
    TreeNode* getroot(vector& preorder,vector& inorder,int pre1,int pre2,int in1,int in2)
    {
        if(pre2-pre1<0||in2-in1<0) return NULL;
        TreeNode* root=new TreeNode(preorder[pre1]);//       
        int indx=in1;//       
        for( ;indxleft=getroot(preorder,inorder,pre1+1,pre1+indx-in1,in1,indx-1);
        root->right=getroot(preorder,inorder,pre1+indx-in1+1,pre2,indx+1,in2);
        return root;
        
    }
    
};