Given inorder and postorder traversal of a tree, construct the binary tree.
Note:
You may assume that duplicates do not exist in the tree.
For example, given
inorder = [9,3,15,20,7]
postorder = [9,15,7,20,3]
Return the following binary tree:
3
/ \
9 20
/ \
15 7
#include <iostream>
#include <vector>
using namespace std;
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
TreeNode* creatTree(vector<int>& inorder, vector<int>& postorder, int inl, int inr, int pl, int pr)
{
if(pl > pr || inl > inr)
return NULL;
TreeNode* root = new TreeNode(postorder[pr]);//根节点
int k;
for(k = inl; k <= inr; ++k)
if(inorder[k] == root->val)//在中序中找到根节点
break;
root->left = creatTree(inorder, postorder, inl, k - 1, pl, pl + k - inl - 1);//左子树
root->right = creatTree(inorder, postorder, k + 1, inr, pl + k - inl, pr - 1);//右子树
return root;
}
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
return creatTree(inorder, postorder, 0, inorder.size() - 1, 0, postorder.size() - 1);
}