1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
class Solution {
public:
TreeNode *buildTree(vector<int> &inorder, vector<int> &postorder) {
// IMPORTANT: Please reset any member data you declared, as
// the same Solution instance will be reused for each test case.
if(inorder.size() <= 0 || postorder.size() <= 0)
return NULL;
TreeNode * root = buildTreeStep(inorder,0,inorder.size()-1,postorder,0,postorder.size()-1);
return root;
}
private:
TreeNode *buildTreeStep(vector<int> &inorder,int ina,int inb,vector<int>&postorder,int poa,int pob) {
if(ina > inb || poa > pob)
return NULL;
int root = postorder[pob];
int i;
for(i = ina;i <= inb;i++) {
if(inorder[i] == root)break;
}
//inleft: ina i-1
//inright:i+1 inb
//poleft:poa,(i-1) - ina + poa
//poright:(i-1) - ina + poa + 1,pob-1
TreeNode * node = new TreeNode(root);
node->left = buildTreeStep(inorder,ina,i-1,postorder,poa,(i-1)-ina+poa);
node->right = buildTreeStep(inorder,i+1,inb,postorder,(i-1) - ina+poa+1,pob-1);
return node;<br />
}
};
|