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; }
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); }
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; }