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:中順遍歴数列の終点
メモリ消費量: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;
}
};