標籤:style io ar 使用 sp for on bs ef
雖然有時候遞迴的效率不高,但可以化繁為簡使做題的效率大大提高。是程式設計重要的一術要熟練掌握 。
就本題來說,最重要的的包括三個方面:
(1)如何設計遞迴體
(2)遞迴參數如何傳遞
(3)遞迴出口怎眼寫才能使程式簡化
首先,遞迴體的形式決定了能否較為簡單的完成程式,如果細節考慮得過於繁瑣,則即使用了遞迴程式也會寫的很痛苦。因為你把本來該電腦自動完成的任務過多得交給了自己。所以,動筆之前,一定要做好頂層設計。本題設計了兩個unordered_map以迅速確定子樹的範圍,並將其設為全域以免參數傳遞的麻煩。
其次,傳什麼,怎麼傳?遞迴體設計好後穿什麼就確定了。比較大的實體可以引用的方式傳遞,如過程無修改再加上const。
最後,如果確定遞迴出口。一定要想到最簡的方式,避免過分地處理細節。
/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public: TreeNode *sub(vector<int> &preorder, int pre1,int pre2,vector<int> &inorder,int in1,int in2){ if(pre2<pre1) return nullptr; <span style="white-space:pre"></span>//very important to assure when the recursion ends TreeNode *root = new TreeNode(preorder[pre1]); //inorder ranges int l1=in1, l2=in[preorder[pre1]]-1; int r1=l2+2, r2=in2; //preoder ranges int ll=pre1+1, lr=pre1+1+(l2-l1); // l2-l1,length of left subtree int rl=lr+1, rr=pre2; root->left=sub(preorder,ll,lr,inorder,l1,l2); root->right=sub(preorder,rl,rr,inorder,r1,r2); return root; } TreeNode *buildTree(vector<int> &preorder, vector<int> &inorder) { if(!preorder.size()||!inorder.size()) return nullptr; if(preorder.size()!=inorder.size()) return nullptr; //pre-processing for(int i=0 ; i< preorder.size();++i) pre[preorder[i]]=i; for(int i=0 ; i< inorder.size();++i) in[inorder[i]]=i; int n=preorder.size()-1; TreeNode *root=sub(preorder,0,n,inorder,0,n); return root; } public: unordered_map<int,int> pre,in;};
前序和中序構造樹的遞迴實現