您的位置:首页 > 其它

[LeetCode] 106. Construct Binary Tree from Inorder and Postorder Traversal

2017-07-03 17:07 351 查看
Given inorder and postorder traversal of a tree, construct the binary tree.

class Solution {
public:
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
return buildTree(inorder.begin(), inorder.end(), postorder.begin(), postorder.end());
}
private:
TreeNode* buildTree(vector<int>::iterator inbegin, vector<int>::iterator inend,
vector<int>::iterator postbegin, vector<int>::iterator postend) {
if (postbegin >= postend) return nullptr;
postend--;
int rootval = *postend;
TreeNode *root = new TreeNode(rootval);
auto mid = find(inbegin, inend, rootval);
const int nleft = mid - inbegin;
root->left = buildTree(inbegin, mid, postbegin, postbegin + nleft);
root->right = buildTree(mid + 1, inend, postbegin + nleft, postend);

return root;
}
};






// 使用hash优化了上面的find操作
class Solution {
public:
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
unordered_map<int, vector<int>::iterator> loc;

for (auto it = inorder.begin(); it != inorder.end(); it++)
loc[*it] = it;

return buildTree(loc, inorder.begin(), inorder.end(), postorder.begin(), postorder.end());
}
private:
TreeNode* buildTree(unordered_map<int, vector<int>::iterator> &loc,
vector<int>::iterator inbegin, vector<int>::iterator inend,
vector<int>::iterator postbegin, vector<int>::iterator postend) {
if (postbegin >= postend) return nullptr;
postend--;
int rootval = *postend;
TreeNode *root = new TreeNode(rootval);
auto mid = loc[rootval];

const int nleft = mid - inbegin;
root->left = buildTree(loc, inbegin, mid, postbegin, postbegin + nleft);
root->right = buildTree(loc, mid + 1, inend, postbegin + nleft, postend);

return root;
}
};




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐