题目描述:
Given inorder and postorder traversal of a tree, construct the binary tree.
Notice
You may assume that duplicates do not exist in the tree.
Example
题目思路:
Given inorder [1,2,3]
and postorder [1,3,2]
, return a tree:
2
/ \
1 3
这题和#73一样,只是对于postorder来说,root永远是数组末尾的那个数。
Mycode(AC = 12ms):
/**
* Definition of TreeNode:
* class TreeNode {
* public:
* int val;
* TreeNode *left, *right;
* TreeNode(int val) {
* this->val = val;
* this->left = this->right = NULL;
* }
* }
*/
class Solution {
/**
*@param inorder : A list of integers that inorder traversal of a tree
*@param postorder : A list of integers that postorder traversal of a tree
*@return : Root of a tree
*/
public:
TreeNode *buildTree(vector<int> &inorder, vector<int> &postorder) {
// write your code here
if (inorder.size() == 0 || inorder.size() != postorder.size()) {
return NULL;
}
return buildTree(inorder, 0, inorder.size() - 1,
postorder, 0, postorder.size() - 1);
}
TreeNode *buildTree(vector<int> &inorder,
int instart,
int inend,
vector<int> &postorder,
int poststart,
int postend)
{
if (instart > inend) {
return NULL;
}
if (instart == inend) {
return new TreeNode(inorder[instart]);
}
// find the root position in inorder
TreeNode *root = new TreeNode(postorder[postend]);
int idx = -1;
for (int i = instart; i <= inend; i++) {
if (inorder[i] == root->val) {
idx = i;
break;
}
}
// left array at inorder[idx] is left tree
// right array at inorder[idx] is right tree
int left_len = idx - instart;
root->left = buildTree(inorder, instart, idx - 1,
postorder, poststart, poststart + left_len - 1);
root->right = buildTree(inorder, idx + 1, inend,
postorder, poststart + left_len, postend - 1);
return root;
}
};