问题:
由中序和后序遍历构造二叉树。
分析:
//实现
TreeNode *addNode(vector<int> &inorder, int s1, int end1, vector<int> &postorder, int s2, int end2)
{
if(s1 > end1 || s2 > end2)
return NULL;
//construct the root
TreeNode *root = new TreeNode(postorder[end2]);
//index_of_root: the index of root in inorder.
int i = s1;
for(; i <= end1; ++i)
{
if(inorder[i] == postorder[end2])
break;
}
if(i > end1)
return NULL;
int dist = i - s1;
//construct the left branch
root->left = addNode(inorder, s1, i - 1, postorder, s2, s2 + dist - 1);
//construct the right branch
root->right = addNode(inorder, i + 1 , end1, postorder, s2 + dist, end2 - 1);
return root;
}
TreeNode *buildTree(vector<int> &inorder, vector<int> &postorder) {
int inLen = inorder.size();
int posLen = postorder.size();
if(inLen == 0 || posLen == 0 || inLen != posLen)
return NULL;
TreeNode *root = addNode(inorder, 0, inLen - 1, postorder, 0, posLen - 1);
return root;
}