コード例 #1
0
ファイル: 889.cpp プロジェクト: lichao111/leetcode
 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;
 }
コード例 #3
0
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);
 }