Example #1
0
 TreeNode* buildTreeHelper(unordered_map<int, int>& inorder_map, int is, int ie, vector<int>& postorder, int ps, int pe){
     if(is > ie || ps > pe){return NULL;}
     int root_val = postorder[pe];
     TreeNode *root =  new TreeNode(root_val);
     int inIndex = inorder_map.find(root_val) -> second;
     int dis = inIndex - is;
     root -> left = buildTreeHelper(inorder_map, is, is + dis - 1, postorder, ps, ps + dis - 1);
     root -> right = buildTreeHelper(inorder_map, is + dis + 1, ie, postorder, ps + dis, pe - 1/*last is root*/);
     return root;
 }
Example #2
0
    TreeNode* buildTreeHelper(vector<int>& post, int is, int ie, int ps, int pe, unordered_map<int, int>& inorder_map) {

        if (is > ie || ps > pe) {
            return NULL;
        }
        int root_val = post[pe];
        TreeNode* root = new TreeNode(root_val);
        int i = inorder_map.find(root_val)->second;
        // number of nodes in left subtree
        int l = i-is;
        root->left = buildTreeHelper(post, is, is+l-1, ps, ps+l-1, inorder_map);
        root->right = buildTreeHelper(post, is+l+1, ie, ps+l, pe-1, inorder_map);

        return root;
    }
 TreeNode *buildTree(vector<int> &inorder, vector<int> &postorder) {
     // Note: The Solution object is instantiated only once and is reused by each test case.
     
     if (inorder.size() == 0) return NULL;
     
     return buildTreeHelper(inorder, 0 ,inorder.size()-1, postorder, 0, postorder.size()-1);
 }
Example #4
0
 TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder){
     unordered_map<int, int> inorder_map;
      // we need a map to look up the position of root in inorder, so
     // that we can divide the tree into separate subtrees,
     // reduces the complexity from n^2 to n assuming good hashing by unodered_map
     for(int i = 0; i < inorder.size(); i ++){
         inorder_map[inorder[i]] = i;
     }
     return buildTreeHelper(inorder_map, 0, inorder.size() - 1, postorder, 0, postorder.size() - 1);
 }        
 TreeNode *buildTreeHelper(vector<int> &inorder, int istart, int iend, vector<int> &postorder, int pstart, int pend){
     if (istart == iend || pstart == pend) return new TreeNode(inorder[istart]);
     if (istart > iend || pstart > pend) return NULL;
     
     //root is postorder[pend]
     TreeNode *root = new TreeNode(postorder[pend]);
     
     // count left child tree node.
     int numLeftChild = 0;
     for (int i = istart; i<=iend; i++){
         if (inorder[i] != postorder[pend]) numLeftChild++;
         else break;
     }
     
     // now build left,right child recursively
     root->left = buildTreeHelper(inorder, istart, istart + numLeftChild - 1, postorder, pstart,pstart+numLeftChild-1);
     root->right = buildTreeHelper(inorder, istart + numLeftChild+1, iend, postorder, pstart + numLeftChild,pend-1);
     
     return root;
 }