TreeNode* buildTreeCore(vector<int>& preorder,int prestart,int prend,vector<int>& inorder,int instart,int inend) { if(prestart>prend) return NULL; int key=preorder[prestart]; TreeNode *root=new TreeNode(key); int pos=0; for(int i=instart;i<=inend;i++) if(inorder[i]==key) { pos=i; break; } int leftlen=pos-instart,rightlen=inend-pos; (*root).left=buildTreeCore(preorder,prestart+1,prestart+leftlen,inorder,instart,pos-1); (*root).right=buildTreeCore(preorder,prestart+leftlen+1,prend,inorder,pos+1,inend); return root; }
void buildTreeCore(TreeNode *root, vector<int> &inorder, int inBegin, int inEnd, vector<int> &postorder, int postEnd) { if (postEnd < 0) return; root->val = postorder[postEnd]; int inPartition = find(inorder, inBegin, inEnd, root->val); if (inPartition >= 0) { if (inBegin < inPartition) { root->left = new TreeNode(0); buildTreeCore(root->left, inorder, inBegin, inPartition - 1, postorder, postEnd - (inEnd - inPartition) - 1); } if (inPartition < inEnd) { root->right = new TreeNode(0); buildTreeCore(root->right, inorder, inPartition + 1, inEnd, postorder, postEnd - 1); } } }
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) { if (inorder.empty() || postorder.empty()) return NULL; if (inorder.size() != postorder.size()) throw "The length of inorder and postorder sequences must be the same."; TreeNode *root = new TreeNode(0); buildTreeCore(root, inorder, 0, inorder.size() - 1, postorder, postorder.size() - 1); return root; }
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) { if(preorder.empty()) return NULL; return buildTreeCore(preorder,0,preorder.size()-1,inorder,0,inorder.size()-1); }