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 30
| class Solution { int len; void insertNode(TreeNode* node, int l, int r, vector<int> &pre_index, vector<int> &post_index, vector<int>& preorder, vector<int>& postorder) { if(l+1 >= r) return; int left = pre_index[node->val] + 1, right = post_index[node->val] - 1; if(left < len && right >= 0) { if(preorder[left] != postorder[right]) { node->left = new TreeNode(preorder[left]); node->right = new TreeNode(postorder[right]); insertNode(node->left, left, pre_index[postorder[right]], pre_index, post_index, preorder, postorder); insertNode(node->right, pre_index[postorder[right]], r, pre_index, post_index, preorder, postorder); } else { node->left = new TreeNode(preorder[left]); insertNode(node->left, left, r, pre_index, post_index, preorder, postorder); } } } public: TreeNode* constructFromPrePost(vector<int>& preorder, vector<int>& postorder) { len = preorder.size(); TreeNode *root = new TreeNode(preorder[0]); vector<int> pre_index(len+1), post_index(len+1); for(int i = 0; i < len; i++) { pre_index[preorder[i]] = i; post_index[postorder[i]] = i; } insertNode(root, 0, len, pre_index, post_index, preorder, postorder); return root; } };
|