题目描述
Given inorder and postorder traversal of a tree, construct the binary tree.
Note:
You may assume that duplicates do not exist in the tree.
实现代码:
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode *buildTree(vector<int> &inorder, vector<int> &postorder) {
return helper(inorder, inorder.begin(), inorder.end(), postorder, postorder.begin(), postorder.end());
}
TreeNode *helper(vector<int>& inorder, vector<int>::iterator begin1, vector<int>::iterator end1,vector<int>& postorder, vector<int>::iterator begin2, vector<int>::iterator end2)
{
if (begin1>=end1 || begin2>=end2)
return 0;
//取后序遍历的最后一个节点构建根节点
int value = *(end2-1);
TreeNode *pNode = new TreeNode(value);
//在中序遍历中,根左边的为左子树节点的中序遍历,右边为右子树节点的中序遍历
vector<int>::iterator it = find(begin1, end1, value);
int leftLength = it - begin1;
//在后序遍历中,除最后一个元素,及根外,前leftLength个节点为左子树的后序遍历,然后是右子树的后序遍历
//通过左子树的后序、中序遍历递归构建左子树
pNode->left = helper(inorder, begin1, it,postorder, begin2, begin2+leftLength);
//通过右子树的后序、中序遍历递归构建右子树
pNode->right = helper(inorder, it+1, end1,postorder, begin2+leftLength, end2-1);
return pNode;
}
};