题目:
解答:
和上一题类似。
从后续序列中,从后向前 不断地获取根节点的值,并且划分中序序列为两个部分。
递归时,先递归右子树 再递归左子树。
代码:
class Solution {
public:
TreeNode *buildTree(vector<int> &inorder, vector<int> &postorder) {
TreeNode *root;
int pos = postorder.size()-1;
root = search(inorder, 0, inorder.size() - 1, postorder, pos);
return root;
}
private:
TreeNode *search(vector<int> &inorder, int begin, int end, vector<int> &postorder, int &pos)
{
if (begin > end)
return NULL;
TreeNode *root = new TreeNode(postorder[pos]);
int mid = find(postorder[pos], inorder, begin, end);
--pos;
root->right = search(inorder, mid + 1, end, postorder, pos);
root->left = search(inorder, begin, mid - 1, postorder, pos);
return root;
}
int find(int target, vector<int> &inorder, int begin, int end)
{
for (int i = begin; i <= end; i++)
{
if (inorder[i] == target)
return i;
}
}
};