您的位置:首页 > 其它

106. Construct Binary Tree from Inorder and Postorder Traversal

2016-03-05 11:44 239 查看
这道题难倒是不难,重点在于不引用vector的话,会内存溢出,借鉴一下:

原始版本:

class Solution {
public:
//copy vec[i,j]
vector<int> vectorCopy(vector<int>& vec, int i, int j) {
if (i > j) {
vector<int> newVec;
return newVec;
}
vector<int> newVec;
for (int k = i; k <= j; k++) {
newVec.push_back(vec[k]);
}
return newVec;
}

TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
TreeNode* root;
if (inorder.size() == 0) {
root = NULL;
return root;
}
else if (inorder.size() == 1) {
root = new TreeNode(inorder[0]);
return root;
}
else {
root = new TreeNode(postorder[postorder.size() - 1]);
}
for (int i = 0; i < inorder.size(); i++) {
if (inorder[i] == postorder[postorder.size() - 1]) {
vector<int> inorderSun = vectorCopy(inorder, 0, i - 1);
vector<int> postorderSun = vectorCopy(postorder, 0, i - 1);
root->left = buildTree(inorderSun, postorderSun);
inorderSun.clear(); postorderSun.clear();
inorderSun = vectorCopy(inorder, i + 1, inorder.size() - 1);
postorderSun = vectorCopy(postorder, i + 1, postorder.size() - 1);
root->right = buildTree(inorderSun, postorderSun);
}
}
return root;
}
};


改进版本:

class Solution {
public:
//[beginIndex, endIndex]
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder, int beginIn, int endIn, int beginPost, int endPost) {
TreeNode* root;
if (endIn < beginIn) {
root = NULL;
return root;
}
else if (endIn == beginIn) {
root = new TreeNode(inorder[beginIn]);
return root;
}
else {
root = new TreeNode(postorder[endPost]);
}
for (int i = beginIn; i <= endIn; i++) {
if (inorder[i] == postorder[endPost]) {
root->left = buildTree(inorder, postorder, beginIn, i - 1, beginPost, beginPost + (i - 1) - beginIn);
root->right = buildTree(inorder, postorder, i + 1, endIn, beginPost + (i - 1 - beginIn + 1), endPost - 1);
}
}
return root;
}

TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
return buildTree(inorder, postorder, 0, inorder.size() - 1, 0, postorder.size() - 1);
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: