TreeNode* constructFromPrePost(vector<int>& pre, vector<int>& post) { if(pre.size()==0) return NULL; TreeNode *root = new TreeNode(*(pre.begin())); if(pre.size()==1){ return root; } else if(pre.size()==2){ (root->left) = new TreeNode(pre[1]); return root; } else if(pre.size()==3){ if(pre[1]==post[0]) { (root->left) = new TreeNode(pre[1]); (root->right) = new TreeNode(pre[2]); } else{ (root->left) = new TreeNode(pre[1]); (root->left)->left = new TreeNode(pre[2]); } return root; } vector<int> t_vecpre; vector<int> t_vecpost; FindVector(pre,post,pre[1],t_vecpre,t_vecpost); root->left = constructFromPrePost(t_vecpre,t_vecpost); cout<<"------------"<<endl; Display(pre); Display(post); t_vecpre.clear(); t_vecpost.clear(); if(pre.size()<=1) { root->right = NULL; } else{ FindVector(pre,post,pre[1],t_vecpre,t_vecpost); root->right = constructFromPrePost(t_vecpre,t_vecpost); } return root; }
TreeNode* constructFromPrePost(int preLeft, int preRight, vector<int>& preOrder, int postLeft, int postRight, vector<int>& postOrder) { if(preLeft > preRight) { return nullptr; } TreeNode* root = new TreeNode(preOrder[preLeft]); if(preLeft == preRight) { return root; } int pivot = -1; for(int i = preLeft + 1; i <= preRight; i++) { if(preOrder[i] == postOrder[postRight - 1]) { pivot = i; break; } } root->left = constructFromPrePost(preLeft + 1, pivot - 1, preOrder, postLeft, postLeft + pivot - 1 - preLeft - 1, postOrder); root->right = constructFromPrePost(pivot, preRight, preOrder, postRight - 1 - preRight + pivot, postRight - 1, postOrder); return root; }
TreeNode *Solution889::constructFromPrePost(vector<int> &pre, vector<int> &post) { TreeNode *root = nullptr; unsigned long len = pre.size(); if (len == 0) return root; root = new TreeNode(pre[0]); if (len == 1) return root; int leftChild = pre[1]; // Only One Child if (leftChild == post[len - 2]) { vector<int> leftPre = vector<int>(pre.begin() + 1, pre.end()); vector<int> leftPost = vector<int>(post.begin(), post.begin() + len - 1); root->left = constructFromPrePost(leftPre, leftPost); } else // Two Children { auto leftChildPosInPost = len - 2; for (; leftChildPosInPost >= 0; --leftChildPosInPost) { if (post[leftChildPosInPost] == pre[1]) break; } vector<int> leftPre = vector<int>(pre.begin() + 1, pre.begin() + 1 + (leftChildPosInPost + 1)); vector<int> leftPost = vector<int>(post.begin(), post.begin() + (leftChildPosInPost + 1)); vector<int> rightPre = vector<int>(pre.begin() + 1 + (leftChildPosInPost + 1), pre.end()); vector<int> rightPost = vector<int>(post.begin() + (leftChildPosInPost + 1), post.end() - 1); root->left = constructFromPrePost(leftPre, leftPost); root->right = constructFromPrePost(rightPre, rightPost); } return root; }
TreeNode* constructFromPrePost(vector<int>& pre, vector<int>& post) { return constructFromPrePost(0, pre.size() - 1, pre, 0, post.size() - 1, post); }